- Deprecated function: Use of "static" in callables is deprecated in Drupal\user\Entity\Role::postLoad() (line 172 of core/modules/user/src/Entity/Role.php).
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)
- Deprecated function: Creation of dynamic property Drupal\views\ManyToOneHelper::$handler is deprecated in Drupal\views\ManyToOneHelper->__construct() (line 24 of core/modules/views/src/ManyToOneHelper.php).
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)
- Deprecated function: Creation of dynamic property Drupal\views\ManyToOneHelper::$handler is deprecated in Drupal\views\ManyToOneHelper->__construct() (line 24 of core/modules/views/src/ManyToOneHelper.php).
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)
- Deprecated function: Creation of dynamic property Drupal\views\ManyToOneHelper::$handler is deprecated in Drupal\views\ManyToOneHelper->__construct() (line 24 of core/modules/views/src/ManyToOneHelper.php).
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)
- Deprecated function: Creation of dynamic property Drupal\views\ManyToOneHelper::$handler is deprecated in Drupal\views\ManyToOneHelper->__construct() (line 24 of core/modules/views/src/ManyToOneHelper.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\views\ManyToOneHelper::$handler is deprecated in Drupal\views\ManyToOneHelper->__construct() (line 24 of core/modules/views/src/ManyToOneHelper.php).
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)
- Deprecated function: Creation of dynamic property Drupal\views\ManyToOneHelper::$handler is deprecated in Drupal\views\ManyToOneHelper->__construct() (line 24 of core/modules/views/src/ManyToOneHelper.php).
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)
- Deprecated function: Creation of dynamic property Drupal\views\ManyToOneHelper::$handler is deprecated in Drupal\views\ManyToOneHelper->__construct() (line 24 of core/modules/views/src/ManyToOneHelper.php).
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)
- Deprecated function: Creation of dynamic property Drupal\views\ManyToOneHelper::$handler is deprecated in Drupal\views\ManyToOneHelper->__construct() (line 24 of core/modules/views/src/ManyToOneHelper.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'f03439f3-8263-43d5-9277-cd95d0973a8e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Los gráficos de violín como los ofrecidos por esta visualización, <strong>Violin Plot</strong>, nos permiten mostrar la distribución de una variable combinando la funcionalidad ofrecida por los clásicos gráficos de caja y los de densidad kernel (KDE).
La configuración de esta visualización es muy sencilla, apenas tres campos:
Supongamos que queremos conocer la distribución de los precios de los productos (qué precios son más o menos frecuentes, etc.). Bastaría con llevar el campo <em>Price</em> de nuestra tabla de productos tanto al campo <em>Measure Data</em> como al campo <em>Sampling</em>:
Visualmente ya se aprecia, por ejemplo, que la mayor parte de los precios rondan los 750€ (valor del eje vertical en la zona más ancha del violín) y que hay más productos con precios bajos que con precios altos (pues la zona inferior del violín es más ancha que la zona superior).
La caja interior muestra el valor de la mediana (raya horizontal blanca) y el primer y tercer cuantil (límites inferior y superior de la caja): es decir, la caja representa el rango intercuantil de la distribución. El extremo superior e inferior de la línea vertical que se incluye en el interior del violín representan los valores máximos y mínimos de los datos, y el círculo (que, en la imagen anterior, se muestra encima de la mediana) representa el valor medio.
Si movemos el cursor encima del violín se muestra una ventana flotante con información adicional:
En la imagen anterior vemos que tenemos 153 muestras (153 precios correspondientes a otros tantos productos), que el valor máximo es de 1.700€, el valor medio es de 731.54€, etc. Es posible añadir datos adicionales en <em>Formato > Default Tooltip Details</em>. Téngase en cuenta que estos valores hacen referencia a la estimación KDE, no a los valores en sí. Por ejemplo, el precio máximo es de 1.347€, no 1.700€ (ya se ha comentado que la línea vertical en el centro del violín sí representa esos valores mínimo y máximo).
Pero podemos estar interesados no en conocer la distribución de los precios, sino en cómo otra variable se distribuye en función de los precios. Por ejemplo, si quisiéramos saber cómo se reparten nuestros beneficios en función del precio del producto, tendríamos que llevar nuestra medida <em>Margin</em> (suma del beneficio derivado de cada venta) a <em>Measure Data</em> y dejar el campo <em>Price</em> (precio de cada producto) en el campo de la visualización <em>Sampling</em>:
La visualización nos indica que los beneficios provienen principalmente de la venta de productos cuyos precios rondan los 200€ y los 800€ (aproximadamente).
Podemos, además, desglosar el violín según otra dimensión, por ejemplo, la categoría de cada producto. Para ello podemos llevar el campo <em>Category</em> de nuestro modelo de datos al campo <em>Category</em> de la visualización:
Podemos comprobar cómo de un simple vistazo es posible hacerse una idea de cómo se reparten nuestros beneficios según el precio del producto y de su categoría.
Es posible aplicar colores a cada uno de los violines en <em>Formato > Data Colors > By Category</em>:
La visualización permite un alto grado de configuración: tipo de kernel a aplicar, el bandwidth, el criterio de ordenación de las categorías, el tipo de gráfica a mostrar en el interior del violín (que, por defecto, ya hemos visto que es una "caja"), se pueden personalizar los ejes, etc.
Se trata de una visualización muy completa y altamente personalizable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'f03439f3-8263-43d5-9277-cd95d0973a8e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Los gráficos de violín como los ofrecidos por esta visualización, <strong>Violin Plot</strong>, nos permiten mostrar la distribución de una variable combinando la funcionalidad ofrecida por los clásicos gráficos de caja y los de densidad kernel (KDE).
La configuración de esta visualización es muy sencilla, apenas tres campos:
Supongamos que queremos conocer la distribución de los precios de los productos (qué precios son más o menos frecuentes, etc.). Bastaría con llevar el campo <em>Price</em> de nuestra tabla de productos tanto al campo <em>Measure Data</em> como al campo <em>Sampling</em>:
Visualmente ya se aprecia, por ejemplo, que la mayor parte de los precios rondan los 750€ (valor del eje vertical en la zona más ancha del violín) y que hay más productos con precios bajos que con precios altos (pues la zona inferior del violín es más ancha que la zona superior).
La caja interior muestra el valor de la mediana (raya horizontal blanca) y el primer y tercer cuantil (límites inferior y superior de la caja): es decir, la caja representa el rango intercuantil de la distribución. El extremo superior e inferior de la línea vertical que se incluye en el interior del violín representan los valores máximos y mínimos de los datos, y el círculo (que, en la imagen anterior, se muestra encima de la mediana) representa el valor medio.
Si movemos el cursor encima del violín se muestra una ventana flotante con información adicional:
En la imagen anterior vemos que tenemos 153 muestras (153 precios correspondientes a otros tantos productos), que el valor máximo es de 1.700€, el valor medio es de 731.54€, etc. Es posible añadir datos adicionales en <em>Formato > Default Tooltip Details</em>. Téngase en cuenta que estos valores hacen referencia a la estimación KDE, no a los valores en sí. Por ejemplo, el precio máximo es de 1.347€, no 1.700€ (ya se ha comentado que la línea vertical en el centro del violín sí representa esos valores mínimo y máximo).
Pero podemos estar interesados no en conocer la distribución de los precios, sino en cómo otra variable se distribuye en función de los precios. Por ejemplo, si quisiéramos saber cómo se reparten nuestros beneficios en función del precio del producto, tendríamos que llevar nuestra medida <em>Margin</em> (suma del beneficio derivado de cada venta) a <em>Measure Data</em> y dejar el campo <em>Price</em> (precio de cada producto) en el campo de la visualización <em>Sampling</em>:
La visualización nos indica que los beneficios provienen principalmente de la venta de productos cuyos precios rondan los 200€ y los 800€ (aproximadamente).
Podemos, además, desglosar el violín según otra dimensión, por ejemplo, la categoría de cada producto. Para ello podemos llevar el campo <em>Category</em> de nuestro modelo de datos al campo <em>Category</em> de la visualización:
Podemos comprobar cómo de un simple vistazo es posible hacerse una idea de cómo se reparten nuestros beneficios según el precio del producto y de su categoría.
Es posible aplicar colores a cada uno de los violines en <em>Formato > Data Colors > By Category</em>:
La visualización permite un alto grado de configuración: tipo de kernel a aplicar, el bandwidth, el criterio de ordenación de las categorías, el tipo de gráfica a mostrar en el interior del violín (que, por defecto, ya hemos visto que es una "caja"), se pueden personalizar los ejes, etc.
Se trata de una visualización muy completa y altamente personalizable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'f03439f3-8263-43d5-9277-cd95d0973a8e') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Los gráficos de violín como los ofrecidos por esta visualización, <strong>Violin Plot</strong>, nos permiten mostrar la distribución de una variable combinando la funcionalidad ofrecida por los clásicos gráficos de caja y los de densidad kernel (KDE).
La configuración de esta visualización es muy sencilla, apenas tres campos:
Supongamos que queremos conocer la distribución de los precios de los productos (qué precios son más o menos frecuentes, etc.). Bastaría con llevar el campo <em>Price</em> de nuestra tabla de productos tanto al campo <em>Measure Data</em> como al campo <em>Sampling</em>:
Visualmente ya se aprecia, por ejemplo, que la mayor parte de los precios rondan los 750€ (valor del eje vertical en la zona más ancha del violín) y que hay más productos con precios bajos que con precios altos (pues la zona inferior del violín es más ancha que la zona superior).
La caja interior muestra el valor de la mediana (raya horizontal blanca) y el primer y tercer cuantil (límites inferior y superior de la caja): es decir, la caja representa el rango intercuantil de la distribución. El extremo superior e inferior de la línea vertical que se incluye en el interior del violín representan los valores máximos y mínimos de los datos, y el círculo (que, en la imagen anterior, se muestra encima de la mediana) representa el valor medio.
Si movemos el cursor encima del violín se muestra una ventana flotante con información adicional:
En la imagen anterior vemos que tenemos 153 muestras (153 precios correspondientes a otros tantos productos), que el valor máximo es de 1.700€, el valor medio es de 731.54€, etc. Es posible añadir datos adicionales en <em>Formato > Default Tooltip Details</em>. Téngase en cuenta que estos valores hacen referencia a la estimación KDE, no a los valores en sí. Por ejemplo, el precio máximo es de 1.347€, no 1.700€ (ya se ha comentado que la línea vertical en el centro del violín sí representa esos valores mínimo y máximo).
Pero podemos estar interesados no en conocer la distribución de los precios, sino en cómo otra variable se distribuye en función de los precios. Por ejemplo, si quisiéramos saber cómo se reparten nuestros beneficios en función del precio del producto, tendríamos que llevar nuestra medida <em>Margin</em> (suma del beneficio derivado de cada venta) a <em>Measure Data</em> y dejar el campo <em>Price</em> (precio de cada producto) en el campo de la visualización <em>Sampling</em>:
La visualización nos indica que los beneficios provienen principalmente de la venta de productos cuyos precios rondan los 200€ y los 800€ (aproximadamente).
Podemos, además, desglosar el violín según otra dimensión, por ejemplo, la categoría de cada producto. Para ello podemos llevar el campo <em>Category</em> de nuestro modelo de datos al campo <em>Category</em> de la visualización:
Podemos comprobar cómo de un simple vistazo es posible hacerse una idea de cómo se reparten nuestros beneficios según el precio del producto y de su categoría.
Es posible aplicar colores a cada uno de los violines en <em>Formato > Data Colors > By Category</em>:
La visualización permite un alto grado de configuración: tipo de kernel a aplicar, el bandwidth, el criterio de ordenación de las categorías, el tipo de gráfica a mostrar en el interior del violín (que, por defecto, ya hemos visto que es una "caja"), se pueden personalizar los ejes, etc.
Se trata de una visualización muy completa y altamente personalizable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'f03439f3-8263-43d5-9277-cd95d0973a8e') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Los gráficos de violín como los ofrecidos por esta visualización, <strong>Violin Plot</strong>, nos permiten mostrar la distribución de una variable combinando la funcionalidad ofrecida por los clásicos gráficos de caja y los de densidad kernel (KDE).
La configuración de esta visualización es muy sencilla, apenas tres campos:
Supongamos que queremos conocer la distribución de los precios de los productos (qué precios son más o menos frecuentes, etc.). Bastaría con llevar el campo <em>Price</em> de nuestra tabla de productos tanto al campo <em>Measure Data</em> como al campo <em>Sampling</em>:
Visualmente ya se aprecia, por ejemplo, que la mayor parte de los precios rondan los 750€ (valor del eje vertical en la zona más ancha del violín) y que hay más productos con precios bajos que con precios altos (pues la zona inferior del violín es más ancha que la zona superior).
La caja interior muestra el valor de la mediana (raya horizontal blanca) y el primer y tercer cuantil (límites inferior y superior de la caja): es decir, la caja representa el rango intercuantil de la distribución. El extremo superior e inferior de la línea vertical que se incluye en el interior del violín representan los valores máximos y mínimos de los datos, y el círculo (que, en la imagen anterior, se muestra encima de la mediana) representa el valor medio.
Si movemos el cursor encima del violín se muestra una ventana flotante con información adicional:
En la imagen anterior vemos que tenemos 153 muestras (153 precios correspondientes a otros tantos productos), que el valor máximo es de 1.700€, el valor medio es de 731.54€, etc. Es posible añadir datos adicionales en <em>Formato > Default Tooltip Details</em>. Téngase en cuenta que estos valores hacen referencia a la estimación KDE, no a los valores en sí. Por ejemplo, el precio máximo es de 1.347€, no 1.700€ (ya se ha comentado que la línea vertical en el centro del violín sí representa esos valores mínimo y máximo).
Pero podemos estar interesados no en conocer la distribución de los precios, sino en cómo otra variable se distribuye en función de los precios. Por ejemplo, si quisiéramos saber cómo se reparten nuestros beneficios en función del precio del producto, tendríamos que llevar nuestra medida <em>Margin</em> (suma del beneficio derivado de cada venta) a <em>Measure Data</em> y dejar el campo <em>Price</em> (precio de cada producto) en el campo de la visualización <em>Sampling</em>:
La visualización nos indica que los beneficios provienen principalmente de la venta de productos cuyos precios rondan los 200€ y los 800€ (aproximadamente).
Podemos, además, desglosar el violín según otra dimensión, por ejemplo, la categoría de cada producto. Para ello podemos llevar el campo <em>Category</em> de nuestro modelo de datos al campo <em>Category</em> de la visualización:
Podemos comprobar cómo de un simple vistazo es posible hacerse una idea de cómo se reparten nuestros beneficios según el precio del producto y de su categoría.
Es posible aplicar colores a cada uno de los violines en <em>Formato > Data Colors > By Category</em>:
La visualización permite un alto grado de configuración: tipo de kernel a aplicar, el bandwidth, el criterio de ordenación de las categorías, el tipo de gráfica a mostrar en el interior del violín (que, por defecto, ya hemos visto que es una "caja"), se pueden personalizar los ejes, etc.
Se trata de una visualización muy completa y altamente personalizable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'e7b4e924-894b-47c1-958f-50c7b49f6224') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Los gráficos de violín como los ofrecidos por esta visualización, <strong>Violin Plot</strong>, nos permiten mostrar la distribución de una variable combinando la funcionalidad ofrecida por los clásicos gráficos de caja y los de densidad kernel (KDE).
La configuración de esta visualización es muy sencilla, apenas tres campos:
Supongamos que queremos conocer la distribución de los precios de los productos (qué precios son más o menos frecuentes, etc.). Bastaría con llevar el campo <em>Price</em> de nuestra tabla de productos tanto al campo <em>Measure Data</em> como al campo <em>Sampling</em>:
Visualmente ya se aprecia, por ejemplo, que la mayor parte de los precios rondan los 750€ (valor del eje vertical en la zona más ancha del violín) y que hay más productos con precios bajos que con precios altos (pues la zona inferior del violín es más ancha que la zona superior).
La caja interior muestra el valor de la mediana (raya horizontal blanca) y el primer y tercer cuantil (límites inferior y superior de la caja): es decir, la caja representa el rango intercuantil de la distribución. El extremo superior e inferior de la línea vertical que se incluye en el interior del violín representan los valores máximos y mínimos de los datos, y el círculo (que, en la imagen anterior, se muestra encima de la mediana) representa el valor medio.
Si movemos el cursor encima del violín se muestra una ventana flotante con información adicional:
En la imagen anterior vemos que tenemos 153 muestras (153 precios correspondientes a otros tantos productos), que el valor máximo es de 1.700€, el valor medio es de 731.54€, etc. Es posible añadir datos adicionales en <em>Formato > Default Tooltip Details</em>. Téngase en cuenta que estos valores hacen referencia a la estimación KDE, no a los valores en sí. Por ejemplo, el precio máximo es de 1.347€, no 1.700€ (ya se ha comentado que la línea vertical en el centro del violín sí representa esos valores mínimo y máximo).
Pero podemos estar interesados no en conocer la distribución de los precios, sino en cómo otra variable se distribuye en función de los precios. Por ejemplo, si quisiéramos saber cómo se reparten nuestros beneficios en función del precio del producto, tendríamos que llevar nuestra medida <em>Margin</em> (suma del beneficio derivado de cada venta) a <em>Measure Data</em> y dejar el campo <em>Price</em> (precio de cada producto) en el campo de la visualización <em>Sampling</em>:
La visualización nos indica que los beneficios provienen principalmente de la venta de productos cuyos precios rondan los 200€ y los 800€ (aproximadamente).
Podemos, además, desglosar el violín según otra dimensión, por ejemplo, la categoría de cada producto. Para ello podemos llevar el campo <em>Category</em> de nuestro modelo de datos al campo <em>Category</em> de la visualización:
Podemos comprobar cómo de un simple vistazo es posible hacerse una idea de cómo se reparten nuestros beneficios según el precio del producto y de su categoría.
Es posible aplicar colores a cada uno de los violines en <em>Formato > Data Colors > By Category</em>:
La visualización permite un alto grado de configuración: tipo de kernel a aplicar, el bandwidth, el criterio de ordenación de las categorías, el tipo de gráfica a mostrar en el interior del violín (que, por defecto, ya hemos visto que es una "caja"), se pueden personalizar los ejes, etc.
Se trata de una visualización muy completa y altamente personalizable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'e7b4e924-894b-47c1-958f-50c7b49f6224') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Los gráficos de violín como los ofrecidos por esta visualización, <strong>Violin Plot</strong>, nos permiten mostrar la distribución de una variable combinando la funcionalidad ofrecida por los clásicos gráficos de caja y los de densidad kernel (KDE).
La configuración de esta visualización es muy sencilla, apenas tres campos:
Supongamos que queremos conocer la distribución de los precios de los productos (qué precios son más o menos frecuentes, etc.). Bastaría con llevar el campo <em>Price</em> de nuestra tabla de productos tanto al campo <em>Measure Data</em> como al campo <em>Sampling</em>:
Visualmente ya se aprecia, por ejemplo, que la mayor parte de los precios rondan los 750€ (valor del eje vertical en la zona más ancha del violín) y que hay más productos con precios bajos que con precios altos (pues la zona inferior del violín es más ancha que la zona superior).
La caja interior muestra el valor de la mediana (raya horizontal blanca) y el primer y tercer cuantil (límites inferior y superior de la caja): es decir, la caja representa el rango intercuantil de la distribución. El extremo superior e inferior de la línea vertical que se incluye en el interior del violín representan los valores máximos y mínimos de los datos, y el círculo (que, en la imagen anterior, se muestra encima de la mediana) representa el valor medio.
Si movemos el cursor encima del violín se muestra una ventana flotante con información adicional:
En la imagen anterior vemos que tenemos 153 muestras (153 precios correspondientes a otros tantos productos), que el valor máximo es de 1.700€, el valor medio es de 731.54€, etc. Es posible añadir datos adicionales en <em>Formato > Default Tooltip Details</em>. Téngase en cuenta que estos valores hacen referencia a la estimación KDE, no a los valores en sí. Por ejemplo, el precio máximo es de 1.347€, no 1.700€ (ya se ha comentado que la línea vertical en el centro del violín sí representa esos valores mínimo y máximo).
Pero podemos estar interesados no en conocer la distribución de los precios, sino en cómo otra variable se distribuye en función de los precios. Por ejemplo, si quisiéramos saber cómo se reparten nuestros beneficios en función del precio del producto, tendríamos que llevar nuestra medida <em>Margin</em> (suma del beneficio derivado de cada venta) a <em>Measure Data</em> y dejar el campo <em>Price</em> (precio de cada producto) en el campo de la visualización <em>Sampling</em>:
La visualización nos indica que los beneficios provienen principalmente de la venta de productos cuyos precios rondan los 200€ y los 800€ (aproximadamente).
Podemos, además, desglosar el violín según otra dimensión, por ejemplo, la categoría de cada producto. Para ello podemos llevar el campo <em>Category</em> de nuestro modelo de datos al campo <em>Category</em> de la visualización:
Podemos comprobar cómo de un simple vistazo es posible hacerse una idea de cómo se reparten nuestros beneficios según el precio del producto y de su categoría.
Es posible aplicar colores a cada uno de los violines en <em>Formato > Data Colors > By Category</em>:
La visualización permite un alto grado de configuración: tipo de kernel a aplicar, el bandwidth, el criterio de ordenación de las categorías, el tipo de gráfica a mostrar en el interior del violín (que, por defecto, ya hemos visto que es una "caja"), se pueden personalizar los ejes, etc.
Se trata de una visualización muy completa y altamente personalizable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'e7b4e924-894b-47c1-958f-50c7b49f6224') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Los gráficos de violín como los ofrecidos por esta visualización, <strong>Violin Plot</strong>, nos permiten mostrar la distribución de una variable combinando la funcionalidad ofrecida por los clásicos gráficos de caja y los de densidad kernel (KDE).
La configuración de esta visualización es muy sencilla, apenas tres campos:
Supongamos que queremos conocer la distribución de los precios de los productos (qué precios son más o menos frecuentes, etc.). Bastaría con llevar el campo <em>Price</em> de nuestra tabla de productos tanto al campo <em>Measure Data</em> como al campo <em>Sampling</em>:
Visualmente ya se aprecia, por ejemplo, que la mayor parte de los precios rondan los 750€ (valor del eje vertical en la zona más ancha del violín) y que hay más productos con precios bajos que con precios altos (pues la zona inferior del violín es más ancha que la zona superior).
La caja interior muestra el valor de la mediana (raya horizontal blanca) y el primer y tercer cuantil (límites inferior y superior de la caja): es decir, la caja representa el rango intercuantil de la distribución. El extremo superior e inferior de la línea vertical que se incluye en el interior del violín representan los valores máximos y mínimos de los datos, y el círculo (que, en la imagen anterior, se muestra encima de la mediana) representa el valor medio.
Si movemos el cursor encima del violín se muestra una ventana flotante con información adicional:
En la imagen anterior vemos que tenemos 153 muestras (153 precios correspondientes a otros tantos productos), que el valor máximo es de 1.700€, el valor medio es de 731.54€, etc. Es posible añadir datos adicionales en <em>Formato > Default Tooltip Details</em>. Téngase en cuenta que estos valores hacen referencia a la estimación KDE, no a los valores en sí. Por ejemplo, el precio máximo es de 1.347€, no 1.700€ (ya se ha comentado que la línea vertical en el centro del violín sí representa esos valores mínimo y máximo).
Pero podemos estar interesados no en conocer la distribución de los precios, sino en cómo otra variable se distribuye en función de los precios. Por ejemplo, si quisiéramos saber cómo se reparten nuestros beneficios en función del precio del producto, tendríamos que llevar nuestra medida <em>Margin</em> (suma del beneficio derivado de cada venta) a <em>Measure Data</em> y dejar el campo <em>Price</em> (precio de cada producto) en el campo de la visualización <em>Sampling</em>:
La visualización nos indica que los beneficios provienen principalmente de la venta de productos cuyos precios rondan los 200€ y los 800€ (aproximadamente).
Podemos, además, desglosar el violín según otra dimensión, por ejemplo, la categoría de cada producto. Para ello podemos llevar el campo <em>Category</em> de nuestro modelo de datos al campo <em>Category</em> de la visualización:
Podemos comprobar cómo de un simple vistazo es posible hacerse una idea de cómo se reparten nuestros beneficios según el precio del producto y de su categoría.
Es posible aplicar colores a cada uno de los violines en <em>Formato > Data Colors > By Category</em>:
La visualización permite un alto grado de configuración: tipo de kernel a aplicar, el bandwidth, el criterio de ordenación de las categorías, el tipo de gráfica a mostrar en el interior del violín (que, por defecto, ya hemos visto que es una "caja"), se pueden personalizar los ejes, etc.
Se trata de una visualización muy completa y altamente personalizable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'e7b4e924-894b-47c1-958f-50c7b49f6224') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Los gráficos de violín como los ofrecidos por esta visualización, <strong>Violin Plot</strong>, nos permiten mostrar la distribución de una variable combinando la funcionalidad ofrecida por los clásicos gráficos de caja y los de densidad kernel (KDE).
La configuración de esta visualización es muy sencilla, apenas tres campos:
Supongamos que queremos conocer la distribución de los precios de los productos (qué precios son más o menos frecuentes, etc.). Bastaría con llevar el campo <em>Price</em> de nuestra tabla de productos tanto al campo <em>Measure Data</em> como al campo <em>Sampling</em>:
Visualmente ya se aprecia, por ejemplo, que la mayor parte de los precios rondan los 750€ (valor del eje vertical en la zona más ancha del violín) y que hay más productos con precios bajos que con precios altos (pues la zona inferior del violín es más ancha que la zona superior).
La caja interior muestra el valor de la mediana (raya horizontal blanca) y el primer y tercer cuantil (límites inferior y superior de la caja): es decir, la caja representa el rango intercuantil de la distribución. El extremo superior e inferior de la línea vertical que se incluye en el interior del violín representan los valores máximos y mínimos de los datos, y el círculo (que, en la imagen anterior, se muestra encima de la mediana) representa el valor medio.
Si movemos el cursor encima del violín se muestra una ventana flotante con información adicional:
En la imagen anterior vemos que tenemos 153 muestras (153 precios correspondientes a otros tantos productos), que el valor máximo es de 1.700€, el valor medio es de 731.54€, etc. Es posible añadir datos adicionales en <em>Formato > Default Tooltip Details</em>. Téngase en cuenta que estos valores hacen referencia a la estimación KDE, no a los valores en sí. Por ejemplo, el precio máximo es de 1.347€, no 1.700€ (ya se ha comentado que la línea vertical en el centro del violín sí representa esos valores mínimo y máximo).
Pero podemos estar interesados no en conocer la distribución de los precios, sino en cómo otra variable se distribuye en función de los precios. Por ejemplo, si quisiéramos saber cómo se reparten nuestros beneficios en función del precio del producto, tendríamos que llevar nuestra medida <em>Margin</em> (suma del beneficio derivado de cada venta) a <em>Measure Data</em> y dejar el campo <em>Price</em> (precio de cada producto) en el campo de la visualización <em>Sampling</em>:
La visualización nos indica que los beneficios provienen principalmente de la venta de productos cuyos precios rondan los 200€ y los 800€ (aproximadamente).
Podemos, además, desglosar el violín según otra dimensión, por ejemplo, la categoría de cada producto. Para ello podemos llevar el campo <em>Category</em> de nuestro modelo de datos al campo <em>Category</em> de la visualización:
Podemos comprobar cómo de un simple vistazo es posible hacerse una idea de cómo se reparten nuestros beneficios según el precio del producto y de su categoría.
Es posible aplicar colores a cada uno de los violines en <em>Formato > Data Colors > By Category</em>:
La visualización permite un alto grado de configuración: tipo de kernel a aplicar, el bandwidth, el criterio de ordenación de las categorías, el tipo de gráfica a mostrar en el interior del violín (que, por defecto, ya hemos visto que es una "caja"), se pueden personalizar los ejes, etc.
Se trata de una visualización muy completa y altamente personalizable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'fa419711-63be-4a39-86c8-509b7eaeff26') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Los gráficos de violín como los ofrecidos por esta visualización, <strong>Violin Plot</strong>, nos permiten mostrar la distribución de una variable combinando la funcionalidad ofrecida por los clásicos gráficos de caja y los de densidad kernel (KDE).
La configuración de esta visualización es muy sencilla, apenas tres campos:
Supongamos que queremos conocer la distribución de los precios de los productos (qué precios son más o menos frecuentes, etc.). Bastaría con llevar el campo <em>Price</em> de nuestra tabla de productos tanto al campo <em>Measure Data</em> como al campo <em>Sampling</em>:
Visualmente ya se aprecia, por ejemplo, que la mayor parte de los precios rondan los 750€ (valor del eje vertical en la zona más ancha del violín) y que hay más productos con precios bajos que con precios altos (pues la zona inferior del violín es más ancha que la zona superior).
La caja interior muestra el valor de la mediana (raya horizontal blanca) y el primer y tercer cuantil (límites inferior y superior de la caja): es decir, la caja representa el rango intercuantil de la distribución. El extremo superior e inferior de la línea vertical que se incluye en el interior del violín representan los valores máximos y mínimos de los datos, y el círculo (que, en la imagen anterior, se muestra encima de la mediana) representa el valor medio.
Si movemos el cursor encima del violín se muestra una ventana flotante con información adicional:
En la imagen anterior vemos que tenemos 153 muestras (153 precios correspondientes a otros tantos productos), que el valor máximo es de 1.700€, el valor medio es de 731.54€, etc. Es posible añadir datos adicionales en <em>Formato > Default Tooltip Details</em>. Téngase en cuenta que estos valores hacen referencia a la estimación KDE, no a los valores en sí. Por ejemplo, el precio máximo es de 1.347€, no 1.700€ (ya se ha comentado que la línea vertical en el centro del violín sí representa esos valores mínimo y máximo).
Pero podemos estar interesados no en conocer la distribución de los precios, sino en cómo otra variable se distribuye en función de los precios. Por ejemplo, si quisiéramos saber cómo se reparten nuestros beneficios en función del precio del producto, tendríamos que llevar nuestra medida <em>Margin</em> (suma del beneficio derivado de cada venta) a <em>Measure Data</em> y dejar el campo <em>Price</em> (precio de cada producto) en el campo de la visualización <em>Sampling</em>:
La visualización nos indica que los beneficios provienen principalmente de la venta de productos cuyos precios rondan los 200€ y los 800€ (aproximadamente).
Podemos, además, desglosar el violín según otra dimensión, por ejemplo, la categoría de cada producto. Para ello podemos llevar el campo <em>Category</em> de nuestro modelo de datos al campo <em>Category</em> de la visualización:
Podemos comprobar cómo de un simple vistazo es posible hacerse una idea de cómo se reparten nuestros beneficios según el precio del producto y de su categoría.
Es posible aplicar colores a cada uno de los violines en <em>Formato > Data Colors > By Category</em>:
La visualización permite un alto grado de configuración: tipo de kernel a aplicar, el bandwidth, el criterio de ordenación de las categorías, el tipo de gráfica a mostrar en el interior del violín (que, por defecto, ya hemos visto que es una "caja"), se pueden personalizar los ejes, etc.
Se trata de una visualización muy completa y altamente personalizable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'fa419711-63be-4a39-86c8-509b7eaeff26') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Los gráficos de violín como los ofrecidos por esta visualización, <strong>Violin Plot</strong>, nos permiten mostrar la distribución de una variable combinando la funcionalidad ofrecida por los clásicos gráficos de caja y los de densidad kernel (KDE).
La configuración de esta visualización es muy sencilla, apenas tres campos:
Supongamos que queremos conocer la distribución de los precios de los productos (qué precios son más o menos frecuentes, etc.). Bastaría con llevar el campo <em>Price</em> de nuestra tabla de productos tanto al campo <em>Measure Data</em> como al campo <em>Sampling</em>:
Visualmente ya se aprecia, por ejemplo, que la mayor parte de los precios rondan los 750€ (valor del eje vertical en la zona más ancha del violín) y que hay más productos con precios bajos que con precios altos (pues la zona inferior del violín es más ancha que la zona superior).
La caja interior muestra el valor de la mediana (raya horizontal blanca) y el primer y tercer cuantil (límites inferior y superior de la caja): es decir, la caja representa el rango intercuantil de la distribución. El extremo superior e inferior de la línea vertical que se incluye en el interior del violín representan los valores máximos y mínimos de los datos, y el círculo (que, en la imagen anterior, se muestra encima de la mediana) representa el valor medio.
Si movemos el cursor encima del violín se muestra una ventana flotante con información adicional:
En la imagen anterior vemos que tenemos 153 muestras (153 precios correspondientes a otros tantos productos), que el valor máximo es de 1.700€, el valor medio es de 731.54€, etc. Es posible añadir datos adicionales en <em>Formato > Default Tooltip Details</em>. Téngase en cuenta que estos valores hacen referencia a la estimación KDE, no a los valores en sí. Por ejemplo, el precio máximo es de 1.347€, no 1.700€ (ya se ha comentado que la línea vertical en el centro del violín sí representa esos valores mínimo y máximo).
Pero podemos estar interesados no en conocer la distribución de los precios, sino en cómo otra variable se distribuye en función de los precios. Por ejemplo, si quisiéramos saber cómo se reparten nuestros beneficios en función del precio del producto, tendríamos que llevar nuestra medida <em>Margin</em> (suma del beneficio derivado de cada venta) a <em>Measure Data</em> y dejar el campo <em>Price</em> (precio de cada producto) en el campo de la visualización <em>Sampling</em>:
La visualización nos indica que los beneficios provienen principalmente de la venta de productos cuyos precios rondan los 200€ y los 800€ (aproximadamente).
Podemos, además, desglosar el violín según otra dimensión, por ejemplo, la categoría de cada producto. Para ello podemos llevar el campo <em>Category</em> de nuestro modelo de datos al campo <em>Category</em> de la visualización:
Podemos comprobar cómo de un simple vistazo es posible hacerse una idea de cómo se reparten nuestros beneficios según el precio del producto y de su categoría.
Es posible aplicar colores a cada uno de los violines en <em>Formato > Data Colors > By Category</em>:
La visualización permite un alto grado de configuración: tipo de kernel a aplicar, el bandwidth, el criterio de ordenación de las categorías, el tipo de gráfica a mostrar en el interior del violín (que, por defecto, ya hemos visto que es una "caja"), se pueden personalizar los ejes, etc.
Se trata de una visualización muy completa y altamente personalizable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'fa419711-63be-4a39-86c8-509b7eaeff26') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Los gráficos de violín como los ofrecidos por esta visualización, <strong>Violin Plot</strong>, nos permiten mostrar la distribución de una variable combinando la funcionalidad ofrecida por los clásicos gráficos de caja y los de densidad kernel (KDE).
La configuración de esta visualización es muy sencilla, apenas tres campos:
Supongamos que queremos conocer la distribución de los precios de los productos (qué precios son más o menos frecuentes, etc.). Bastaría con llevar el campo <em>Price</em> de nuestra tabla de productos tanto al campo <em>Measure Data</em> como al campo <em>Sampling</em>:
Visualmente ya se aprecia, por ejemplo, que la mayor parte de los precios rondan los 750€ (valor del eje vertical en la zona más ancha del violín) y que hay más productos con precios bajos que con precios altos (pues la zona inferior del violín es más ancha que la zona superior).
La caja interior muestra el valor de la mediana (raya horizontal blanca) y el primer y tercer cuantil (límites inferior y superior de la caja): es decir, la caja representa el rango intercuantil de la distribución. El extremo superior e inferior de la línea vertical que se incluye en el interior del violín representan los valores máximos y mínimos de los datos, y el círculo (que, en la imagen anterior, se muestra encima de la mediana) representa el valor medio.
Si movemos el cursor encima del violín se muestra una ventana flotante con información adicional:
En la imagen anterior vemos que tenemos 153 muestras (153 precios correspondientes a otros tantos productos), que el valor máximo es de 1.700€, el valor medio es de 731.54€, etc. Es posible añadir datos adicionales en <em>Formato > Default Tooltip Details</em>. Téngase en cuenta que estos valores hacen referencia a la estimación KDE, no a los valores en sí. Por ejemplo, el precio máximo es de 1.347€, no 1.700€ (ya se ha comentado que la línea vertical en el centro del violín sí representa esos valores mínimo y máximo).
Pero podemos estar interesados no en conocer la distribución de los precios, sino en cómo otra variable se distribuye en función de los precios. Por ejemplo, si quisiéramos saber cómo se reparten nuestros beneficios en función del precio del producto, tendríamos que llevar nuestra medida <em>Margin</em> (suma del beneficio derivado de cada venta) a <em>Measure Data</em> y dejar el campo <em>Price</em> (precio de cada producto) en el campo de la visualización <em>Sampling</em>:
La visualización nos indica que los beneficios provienen principalmente de la venta de productos cuyos precios rondan los 200€ y los 800€ (aproximadamente).
Podemos, además, desglosar el violín según otra dimensión, por ejemplo, la categoría de cada producto. Para ello podemos llevar el campo <em>Category</em> de nuestro modelo de datos al campo <em>Category</em> de la visualización:
Podemos comprobar cómo de un simple vistazo es posible hacerse una idea de cómo se reparten nuestros beneficios según el precio del producto y de su categoría.
Es posible aplicar colores a cada uno de los violines en <em>Formato > Data Colors > By Category</em>:
La visualización permite un alto grado de configuración: tipo de kernel a aplicar, el bandwidth, el criterio de ordenación de las categorías, el tipo de gráfica a mostrar en el interior del violín (que, por defecto, ya hemos visto que es una "caja"), se pueden personalizar los ejes, etc.
Se trata de una visualización muy completa y altamente personalizable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'fa419711-63be-4a39-86c8-509b7eaeff26') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Los gráficos de violín como los ofrecidos por esta visualización, <strong>Violin Plot</strong>, nos permiten mostrar la distribución de una variable combinando la funcionalidad ofrecida por los clásicos gráficos de caja y los de densidad kernel (KDE).
La configuración de esta visualización es muy sencilla, apenas tres campos:
Supongamos que queremos conocer la distribución de los precios de los productos (qué precios son más o menos frecuentes, etc.). Bastaría con llevar el campo <em>Price</em> de nuestra tabla de productos tanto al campo <em>Measure Data</em> como al campo <em>Sampling</em>:
Visualmente ya se aprecia, por ejemplo, que la mayor parte de los precios rondan los 750€ (valor del eje vertical en la zona más ancha del violín) y que hay más productos con precios bajos que con precios altos (pues la zona inferior del violín es más ancha que la zona superior).
La caja interior muestra el valor de la mediana (raya horizontal blanca) y el primer y tercer cuantil (límites inferior y superior de la caja): es decir, la caja representa el rango intercuantil de la distribución. El extremo superior e inferior de la línea vertical que se incluye en el interior del violín representan los valores máximos y mínimos de los datos, y el círculo (que, en la imagen anterior, se muestra encima de la mediana) representa el valor medio.
Si movemos el cursor encima del violín se muestra una ventana flotante con información adicional:
En la imagen anterior vemos que tenemos 153 muestras (153 precios correspondientes a otros tantos productos), que el valor máximo es de 1.700€, el valor medio es de 731.54€, etc. Es posible añadir datos adicionales en <em>Formato > Default Tooltip Details</em>. Téngase en cuenta que estos valores hacen referencia a la estimación KDE, no a los valores en sí. Por ejemplo, el precio máximo es de 1.347€, no 1.700€ (ya se ha comentado que la línea vertical en el centro del violín sí representa esos valores mínimo y máximo).
Pero podemos estar interesados no en conocer la distribución de los precios, sino en cómo otra variable se distribuye en función de los precios. Por ejemplo, si quisiéramos saber cómo se reparten nuestros beneficios en función del precio del producto, tendríamos que llevar nuestra medida <em>Margin</em> (suma del beneficio derivado de cada venta) a <em>Measure Data</em> y dejar el campo <em>Price</em> (precio de cada producto) en el campo de la visualización <em>Sampling</em>:
La visualización nos indica que los beneficios provienen principalmente de la venta de productos cuyos precios rondan los 200€ y los 800€ (aproximadamente).
Podemos, además, desglosar el violín según otra dimensión, por ejemplo, la categoría de cada producto. Para ello podemos llevar el campo <em>Category</em> de nuestro modelo de datos al campo <em>Category</em> de la visualización:
Podemos comprobar cómo de un simple vistazo es posible hacerse una idea de cómo se reparten nuestros beneficios según el precio del producto y de su categoría.
Es posible aplicar colores a cada uno de los violines en <em>Formato > Data Colors > By Category</em>:
La visualización permite un alto grado de configuración: tipo de kernel a aplicar, el bandwidth, el criterio de ordenación de las categorías, el tipo de gráfica a mostrar en el interior del violín (que, por defecto, ya hemos visto que es una "caja"), se pueden personalizar los ejes, etc.
Se trata de una visualización muy completa y altamente personalizable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '6bc5c7cf-8422-4816-876b-6086620f9e71') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Los gráficos de violín como los ofrecidos por esta visualización, <strong>Violin Plot</strong>, nos permiten mostrar la distribución de una variable combinando la funcionalidad ofrecida por los clásicos gráficos de caja y los de densidad kernel (KDE).
La configuración de esta visualización es muy sencilla, apenas tres campos:
Supongamos que queremos conocer la distribución de los precios de los productos (qué precios son más o menos frecuentes, etc.). Bastaría con llevar el campo <em>Price</em> de nuestra tabla de productos tanto al campo <em>Measure Data</em> como al campo <em>Sampling</em>:
Visualmente ya se aprecia, por ejemplo, que la mayor parte de los precios rondan los 750€ (valor del eje vertical en la zona más ancha del violín) y que hay más productos con precios bajos que con precios altos (pues la zona inferior del violín es más ancha que la zona superior).
La caja interior muestra el valor de la mediana (raya horizontal blanca) y el primer y tercer cuantil (límites inferior y superior de la caja): es decir, la caja representa el rango intercuantil de la distribución. El extremo superior e inferior de la línea vertical que se incluye en el interior del violín representan los valores máximos y mínimos de los datos, y el círculo (que, en la imagen anterior, se muestra encima de la mediana) representa el valor medio.
Si movemos el cursor encima del violín se muestra una ventana flotante con información adicional:
En la imagen anterior vemos que tenemos 153 muestras (153 precios correspondientes a otros tantos productos), que el valor máximo es de 1.700€, el valor medio es de 731.54€, etc. Es posible añadir datos adicionales en <em>Formato > Default Tooltip Details</em>. Téngase en cuenta que estos valores hacen referencia a la estimación KDE, no a los valores en sí. Por ejemplo, el precio máximo es de 1.347€, no 1.700€ (ya se ha comentado que la línea vertical en el centro del violín sí representa esos valores mínimo y máximo).
Pero podemos estar interesados no en conocer la distribución de los precios, sino en cómo otra variable se distribuye en función de los precios. Por ejemplo, si quisiéramos saber cómo se reparten nuestros beneficios en función del precio del producto, tendríamos que llevar nuestra medida <em>Margin</em> (suma del beneficio derivado de cada venta) a <em>Measure Data</em> y dejar el campo <em>Price</em> (precio de cada producto) en el campo de la visualización <em>Sampling</em>:
La visualización nos indica que los beneficios provienen principalmente de la venta de productos cuyos precios rondan los 200€ y los 800€ (aproximadamente).
Podemos, además, desglosar el violín según otra dimensión, por ejemplo, la categoría de cada producto. Para ello podemos llevar el campo <em>Category</em> de nuestro modelo de datos al campo <em>Category</em> de la visualización:
Podemos comprobar cómo de un simple vistazo es posible hacerse una idea de cómo se reparten nuestros beneficios según el precio del producto y de su categoría.
Es posible aplicar colores a cada uno de los violines en <em>Formato > Data Colors > By Category</em>:
La visualización permite un alto grado de configuración: tipo de kernel a aplicar, el bandwidth, el criterio de ordenación de las categorías, el tipo de gráfica a mostrar en el interior del violín (que, por defecto, ya hemos visto que es una "caja"), se pueden personalizar los ejes, etc.
Se trata de una visualización muy completa y altamente personalizable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '6bc5c7cf-8422-4816-876b-6086620f9e71') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Los gráficos de violín como los ofrecidos por esta visualización, <strong>Violin Plot</strong>, nos permiten mostrar la distribución de una variable combinando la funcionalidad ofrecida por los clásicos gráficos de caja y los de densidad kernel (KDE).
La configuración de esta visualización es muy sencilla, apenas tres campos:
Supongamos que queremos conocer la distribución de los precios de los productos (qué precios son más o menos frecuentes, etc.). Bastaría con llevar el campo <em>Price</em> de nuestra tabla de productos tanto al campo <em>Measure Data</em> como al campo <em>Sampling</em>:
Visualmente ya se aprecia, por ejemplo, que la mayor parte de los precios rondan los 750€ (valor del eje vertical en la zona más ancha del violín) y que hay más productos con precios bajos que con precios altos (pues la zona inferior del violín es más ancha que la zona superior).
La caja interior muestra el valor de la mediana (raya horizontal blanca) y el primer y tercer cuantil (límites inferior y superior de la caja): es decir, la caja representa el rango intercuantil de la distribución. El extremo superior e inferior de la línea vertical que se incluye en el interior del violín representan los valores máximos y mínimos de los datos, y el círculo (que, en la imagen anterior, se muestra encima de la mediana) representa el valor medio.
Si movemos el cursor encima del violín se muestra una ventana flotante con información adicional:
En la imagen anterior vemos que tenemos 153 muestras (153 precios correspondientes a otros tantos productos), que el valor máximo es de 1.700€, el valor medio es de 731.54€, etc. Es posible añadir datos adicionales en <em>Formato > Default Tooltip Details</em>. Téngase en cuenta que estos valores hacen referencia a la estimación KDE, no a los valores en sí. Por ejemplo, el precio máximo es de 1.347€, no 1.700€ (ya se ha comentado que la línea vertical en el centro del violín sí representa esos valores mínimo y máximo).
Pero podemos estar interesados no en conocer la distribución de los precios, sino en cómo otra variable se distribuye en función de los precios. Por ejemplo, si quisiéramos saber cómo se reparten nuestros beneficios en función del precio del producto, tendríamos que llevar nuestra medida <em>Margin</em> (suma del beneficio derivado de cada venta) a <em>Measure Data</em> y dejar el campo <em>Price</em> (precio de cada producto) en el campo de la visualización <em>Sampling</em>:
La visualización nos indica que los beneficios provienen principalmente de la venta de productos cuyos precios rondan los 200€ y los 800€ (aproximadamente).
Podemos, además, desglosar el violín según otra dimensión, por ejemplo, la categoría de cada producto. Para ello podemos llevar el campo <em>Category</em> de nuestro modelo de datos al campo <em>Category</em> de la visualización:
Podemos comprobar cómo de un simple vistazo es posible hacerse una idea de cómo se reparten nuestros beneficios según el precio del producto y de su categoría.
Es posible aplicar colores a cada uno de los violines en <em>Formato > Data Colors > By Category</em>:
La visualización permite un alto grado de configuración: tipo de kernel a aplicar, el bandwidth, el criterio de ordenación de las categorías, el tipo de gráfica a mostrar en el interior del violín (que, por defecto, ya hemos visto que es una "caja"), se pueden personalizar los ejes, etc.
Se trata de una visualización muy completa y altamente personalizable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '6bc5c7cf-8422-4816-876b-6086620f9e71') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Los gráficos de violín como los ofrecidos por esta visualización, <strong>Violin Plot</strong>, nos permiten mostrar la distribución de una variable combinando la funcionalidad ofrecida por los clásicos gráficos de caja y los de densidad kernel (KDE).
La configuración de esta visualización es muy sencilla, apenas tres campos:
Supongamos que queremos conocer la distribución de los precios de los productos (qué precios son más o menos frecuentes, etc.). Bastaría con llevar el campo <em>Price</em> de nuestra tabla de productos tanto al campo <em>Measure Data</em> como al campo <em>Sampling</em>:
Visualmente ya se aprecia, por ejemplo, que la mayor parte de los precios rondan los 750€ (valor del eje vertical en la zona más ancha del violín) y que hay más productos con precios bajos que con precios altos (pues la zona inferior del violín es más ancha que la zona superior).
La caja interior muestra el valor de la mediana (raya horizontal blanca) y el primer y tercer cuantil (límites inferior y superior de la caja): es decir, la caja representa el rango intercuantil de la distribución. El extremo superior e inferior de la línea vertical que se incluye en el interior del violín representan los valores máximos y mínimos de los datos, y el círculo (que, en la imagen anterior, se muestra encima de la mediana) representa el valor medio.
Si movemos el cursor encima del violín se muestra una ventana flotante con información adicional:
En la imagen anterior vemos que tenemos 153 muestras (153 precios correspondientes a otros tantos productos), que el valor máximo es de 1.700€, el valor medio es de 731.54€, etc. Es posible añadir datos adicionales en <em>Formato > Default Tooltip Details</em>. Téngase en cuenta que estos valores hacen referencia a la estimación KDE, no a los valores en sí. Por ejemplo, el precio máximo es de 1.347€, no 1.700€ (ya se ha comentado que la línea vertical en el centro del violín sí representa esos valores mínimo y máximo).
Pero podemos estar interesados no en conocer la distribución de los precios, sino en cómo otra variable se distribuye en función de los precios. Por ejemplo, si quisiéramos saber cómo se reparten nuestros beneficios en función del precio del producto, tendríamos que llevar nuestra medida <em>Margin</em> (suma del beneficio derivado de cada venta) a <em>Measure Data</em> y dejar el campo <em>Price</em> (precio de cada producto) en el campo de la visualización <em>Sampling</em>:
La visualización nos indica que los beneficios provienen principalmente de la venta de productos cuyos precios rondan los 200€ y los 800€ (aproximadamente).
Podemos, además, desglosar el violín según otra dimensión, por ejemplo, la categoría de cada producto. Para ello podemos llevar el campo <em>Category</em> de nuestro modelo de datos al campo <em>Category</em> de la visualización:
Podemos comprobar cómo de un simple vistazo es posible hacerse una idea de cómo se reparten nuestros beneficios según el precio del producto y de su categoría.
Es posible aplicar colores a cada uno de los violines en <em>Formato > Data Colors > By Category</em>:
La visualización permite un alto grado de configuración: tipo de kernel a aplicar, el bandwidth, el criterio de ordenación de las categorías, el tipo de gráfica a mostrar en el interior del violín (que, por defecto, ya hemos visto que es una "caja"), se pueden personalizar los ejes, etc.
Se trata de una visualización muy completa y altamente personalizable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '6bc5c7cf-8422-4816-876b-6086620f9e71') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Los gráficos de violín como los ofrecidos por esta visualización, <strong>Violin Plot</strong>, nos permiten mostrar la distribución de una variable combinando la funcionalidad ofrecida por los clásicos gráficos de caja y los de densidad kernel (KDE).
La configuración de esta visualización es muy sencilla, apenas tres campos:
Supongamos que queremos conocer la distribución de los precios de los productos (qué precios son más o menos frecuentes, etc.). Bastaría con llevar el campo <em>Price</em> de nuestra tabla de productos tanto al campo <em>Measure Data</em> como al campo <em>Sampling</em>:
Visualmente ya se aprecia, por ejemplo, que la mayor parte de los precios rondan los 750€ (valor del eje vertical en la zona más ancha del violín) y que hay más productos con precios bajos que con precios altos (pues la zona inferior del violín es más ancha que la zona superior).
La caja interior muestra el valor de la mediana (raya horizontal blanca) y el primer y tercer cuantil (límites inferior y superior de la caja): es decir, la caja representa el rango intercuantil de la distribución. El extremo superior e inferior de la línea vertical que se incluye en el interior del violín representan los valores máximos y mínimos de los datos, y el círculo (que, en la imagen anterior, se muestra encima de la mediana) representa el valor medio.
Si movemos el cursor encima del violín se muestra una ventana flotante con información adicional:
En la imagen anterior vemos que tenemos 153 muestras (153 precios correspondientes a otros tantos productos), que el valor máximo es de 1.700€, el valor medio es de 731.54€, etc. Es posible añadir datos adicionales en <em>Formato > Default Tooltip Details</em>. Téngase en cuenta que estos valores hacen referencia a la estimación KDE, no a los valores en sí. Por ejemplo, el precio máximo es de 1.347€, no 1.700€ (ya se ha comentado que la línea vertical en el centro del violín sí representa esos valores mínimo y máximo).
Pero podemos estar interesados no en conocer la distribución de los precios, sino en cómo otra variable se distribuye en función de los precios. Por ejemplo, si quisiéramos saber cómo se reparten nuestros beneficios en función del precio del producto, tendríamos que llevar nuestra medida <em>Margin</em> (suma del beneficio derivado de cada venta) a <em>Measure Data</em> y dejar el campo <em>Price</em> (precio de cada producto) en el campo de la visualización <em>Sampling</em>:
La visualización nos indica que los beneficios provienen principalmente de la venta de productos cuyos precios rondan los 200€ y los 800€ (aproximadamente).
Podemos, además, desglosar el violín según otra dimensión, por ejemplo, la categoría de cada producto. Para ello podemos llevar el campo <em>Category</em> de nuestro modelo de datos al campo <em>Category</em> de la visualización:
Podemos comprobar cómo de un simple vistazo es posible hacerse una idea de cómo se reparten nuestros beneficios según el precio del producto y de su categoría.
Es posible aplicar colores a cada uno de los violines en <em>Formato > Data Colors > By Category</em>:
La visualización permite un alto grado de configuración: tipo de kernel a aplicar, el bandwidth, el criterio de ordenación de las categorías, el tipo de gráfica a mostrar en el interior del violín (que, por defecto, ya hemos visto que es una "caja"), se pueden personalizar los ejes, etc.
Se trata de una visualización muy completa y altamente personalizable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '5d0e4eba-873c-4325-a735-e936221b0b62') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Los gráficos de violín como los ofrecidos por esta visualización, <strong>Violin Plot</strong>, nos permiten mostrar la distribución de una variable combinando la funcionalidad ofrecida por los clásicos gráficos de caja y los de densidad kernel (KDE).
La configuración de esta visualización es muy sencilla, apenas tres campos:
Supongamos que queremos conocer la distribución de los precios de los productos (qué precios son más o menos frecuentes, etc.). Bastaría con llevar el campo <em>Price</em> de nuestra tabla de productos tanto al campo <em>Measure Data</em> como al campo <em>Sampling</em>:
Visualmente ya se aprecia, por ejemplo, que la mayor parte de los precios rondan los 750€ (valor del eje vertical en la zona más ancha del violín) y que hay más productos con precios bajos que con precios altos (pues la zona inferior del violín es más ancha que la zona superior).
La caja interior muestra el valor de la mediana (raya horizontal blanca) y el primer y tercer cuantil (límites inferior y superior de la caja): es decir, la caja representa el rango intercuantil de la distribución. El extremo superior e inferior de la línea vertical que se incluye en el interior del violín representan los valores máximos y mínimos de los datos, y el círculo (que, en la imagen anterior, se muestra encima de la mediana) representa el valor medio.
Si movemos el cursor encima del violín se muestra una ventana flotante con información adicional:
En la imagen anterior vemos que tenemos 153 muestras (153 precios correspondientes a otros tantos productos), que el valor máximo es de 1.700€, el valor medio es de 731.54€, etc. Es posible añadir datos adicionales en <em>Formato > Default Tooltip Details</em>. Téngase en cuenta que estos valores hacen referencia a la estimación KDE, no a los valores en sí. Por ejemplo, el precio máximo es de 1.347€, no 1.700€ (ya se ha comentado que la línea vertical en el centro del violín sí representa esos valores mínimo y máximo).
Pero podemos estar interesados no en conocer la distribución de los precios, sino en cómo otra variable se distribuye en función de los precios. Por ejemplo, si quisiéramos saber cómo se reparten nuestros beneficios en función del precio del producto, tendríamos que llevar nuestra medida <em>Margin</em> (suma del beneficio derivado de cada venta) a <em>Measure Data</em> y dejar el campo <em>Price</em> (precio de cada producto) en el campo de la visualización <em>Sampling</em>:
La visualización nos indica que los beneficios provienen principalmente de la venta de productos cuyos precios rondan los 200€ y los 800€ (aproximadamente).
Podemos, además, desglosar el violín según otra dimensión, por ejemplo, la categoría de cada producto. Para ello podemos llevar el campo <em>Category</em> de nuestro modelo de datos al campo <em>Category</em> de la visualización:
Podemos comprobar cómo de un simple vistazo es posible hacerse una idea de cómo se reparten nuestros beneficios según el precio del producto y de su categoría.
Es posible aplicar colores a cada uno de los violines en <em>Formato > Data Colors > By Category</em>:
La visualización permite un alto grado de configuración: tipo de kernel a aplicar, el bandwidth, el criterio de ordenación de las categorías, el tipo de gráfica a mostrar en el interior del violín (que, por defecto, ya hemos visto que es una "caja"), se pueden personalizar los ejes, etc.
Se trata de una visualización muy completa y altamente personalizable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '5d0e4eba-873c-4325-a735-e936221b0b62') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Los gráficos de violín como los ofrecidos por esta visualización, <strong>Violin Plot</strong>, nos permiten mostrar la distribución de una variable combinando la funcionalidad ofrecida por los clásicos gráficos de caja y los de densidad kernel (KDE).
La configuración de esta visualización es muy sencilla, apenas tres campos:
Supongamos que queremos conocer la distribución de los precios de los productos (qué precios son más o menos frecuentes, etc.). Bastaría con llevar el campo <em>Price</em> de nuestra tabla de productos tanto al campo <em>Measure Data</em> como al campo <em>Sampling</em>:
Visualmente ya se aprecia, por ejemplo, que la mayor parte de los precios rondan los 750€ (valor del eje vertical en la zona más ancha del violín) y que hay más productos con precios bajos que con precios altos (pues la zona inferior del violín es más ancha que la zona superior).
La caja interior muestra el valor de la mediana (raya horizontal blanca) y el primer y tercer cuantil (límites inferior y superior de la caja): es decir, la caja representa el rango intercuantil de la distribución. El extremo superior e inferior de la línea vertical que se incluye en el interior del violín representan los valores máximos y mínimos de los datos, y el círculo (que, en la imagen anterior, se muestra encima de la mediana) representa el valor medio.
Si movemos el cursor encima del violín se muestra una ventana flotante con información adicional:
En la imagen anterior vemos que tenemos 153 muestras (153 precios correspondientes a otros tantos productos), que el valor máximo es de 1.700€, el valor medio es de 731.54€, etc. Es posible añadir datos adicionales en <em>Formato > Default Tooltip Details</em>. Téngase en cuenta que estos valores hacen referencia a la estimación KDE, no a los valores en sí. Por ejemplo, el precio máximo es de 1.347€, no 1.700€ (ya se ha comentado que la línea vertical en el centro del violín sí representa esos valores mínimo y máximo).
Pero podemos estar interesados no en conocer la distribución de los precios, sino en cómo otra variable se distribuye en función de los precios. Por ejemplo, si quisiéramos saber cómo se reparten nuestros beneficios en función del precio del producto, tendríamos que llevar nuestra medida <em>Margin</em> (suma del beneficio derivado de cada venta) a <em>Measure Data</em> y dejar el campo <em>Price</em> (precio de cada producto) en el campo de la visualización <em>Sampling</em>:
La visualización nos indica que los beneficios provienen principalmente de la venta de productos cuyos precios rondan los 200€ y los 800€ (aproximadamente).
Podemos, además, desglosar el violín según otra dimensión, por ejemplo, la categoría de cada producto. Para ello podemos llevar el campo <em>Category</em> de nuestro modelo de datos al campo <em>Category</em> de la visualización:
Podemos comprobar cómo de un simple vistazo es posible hacerse una idea de cómo se reparten nuestros beneficios según el precio del producto y de su categoría.
Es posible aplicar colores a cada uno de los violines en <em>Formato > Data Colors > By Category</em>:
La visualización permite un alto grado de configuración: tipo de kernel a aplicar, el bandwidth, el criterio de ordenación de las categorías, el tipo de gráfica a mostrar en el interior del violín (que, por defecto, ya hemos visto que es una "caja"), se pueden personalizar los ejes, etc.
Se trata de una visualización muy completa y altamente personalizable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '5d0e4eba-873c-4325-a735-e936221b0b62') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Los gráficos de violín como los ofrecidos por esta visualización, <strong>Violin Plot</strong>, nos permiten mostrar la distribución de una variable combinando la funcionalidad ofrecida por los clásicos gráficos de caja y los de densidad kernel (KDE).
La configuración de esta visualización es muy sencilla, apenas tres campos:
Supongamos que queremos conocer la distribución de los precios de los productos (qué precios son más o menos frecuentes, etc.). Bastaría con llevar el campo <em>Price</em> de nuestra tabla de productos tanto al campo <em>Measure Data</em> como al campo <em>Sampling</em>:
Visualmente ya se aprecia, por ejemplo, que la mayor parte de los precios rondan los 750€ (valor del eje vertical en la zona más ancha del violín) y que hay más productos con precios bajos que con precios altos (pues la zona inferior del violín es más ancha que la zona superior).
La caja interior muestra el valor de la mediana (raya horizontal blanca) y el primer y tercer cuantil (límites inferior y superior de la caja): es decir, la caja representa el rango intercuantil de la distribución. El extremo superior e inferior de la línea vertical que se incluye en el interior del violín representan los valores máximos y mínimos de los datos, y el círculo (que, en la imagen anterior, se muestra encima de la mediana) representa el valor medio.
Si movemos el cursor encima del violín se muestra una ventana flotante con información adicional:
En la imagen anterior vemos que tenemos 153 muestras (153 precios correspondientes a otros tantos productos), que el valor máximo es de 1.700€, el valor medio es de 731.54€, etc. Es posible añadir datos adicionales en <em>Formato > Default Tooltip Details</em>. Téngase en cuenta que estos valores hacen referencia a la estimación KDE, no a los valores en sí. Por ejemplo, el precio máximo es de 1.347€, no 1.700€ (ya se ha comentado que la línea vertical en el centro del violín sí representa esos valores mínimo y máximo).
Pero podemos estar interesados no en conocer la distribución de los precios, sino en cómo otra variable se distribuye en función de los precios. Por ejemplo, si quisiéramos saber cómo se reparten nuestros beneficios en función del precio del producto, tendríamos que llevar nuestra medida <em>Margin</em> (suma del beneficio derivado de cada venta) a <em>Measure Data</em> y dejar el campo <em>Price</em> (precio de cada producto) en el campo de la visualización <em>Sampling</em>:
La visualización nos indica que los beneficios provienen principalmente de la venta de productos cuyos precios rondan los 200€ y los 800€ (aproximadamente).
Podemos, además, desglosar el violín según otra dimensión, por ejemplo, la categoría de cada producto. Para ello podemos llevar el campo <em>Category</em> de nuestro modelo de datos al campo <em>Category</em> de la visualización:
Podemos comprobar cómo de un simple vistazo es posible hacerse una idea de cómo se reparten nuestros beneficios según el precio del producto y de su categoría.
Es posible aplicar colores a cada uno de los violines en <em>Formato > Data Colors > By Category</em>:
La visualización permite un alto grado de configuración: tipo de kernel a aplicar, el bandwidth, el criterio de ordenación de las categorías, el tipo de gráfica a mostrar en el interior del violín (que, por defecto, ya hemos visto que es una "caja"), se pueden personalizar los ejes, etc.
Se trata de una visualización muy completa y altamente personalizable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '5d0e4eba-873c-4325-a735-e936221b0b62') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Los gráficos de violín como los ofrecidos por esta visualización, <strong>Violin Plot</strong>, nos permiten mostrar la distribución de una variable combinando la funcionalidad ofrecida por los clásicos gráficos de caja y los de densidad kernel (KDE).
La configuración de esta visualización es muy sencilla, apenas tres campos:
Supongamos que queremos conocer la distribución de los precios de los productos (qué precios son más o menos frecuentes, etc.). Bastaría con llevar el campo <em>Price</em> de nuestra tabla de productos tanto al campo <em>Measure Data</em> como al campo <em>Sampling</em>:
Visualmente ya se aprecia, por ejemplo, que la mayor parte de los precios rondan los 750€ (valor del eje vertical en la zona más ancha del violín) y que hay más productos con precios bajos que con precios altos (pues la zona inferior del violín es más ancha que la zona superior).
La caja interior muestra el valor de la mediana (raya horizontal blanca) y el primer y tercer cuantil (límites inferior y superior de la caja): es decir, la caja representa el rango intercuantil de la distribución. El extremo superior e inferior de la línea vertical que se incluye en el interior del violín representan los valores máximos y mínimos de los datos, y el círculo (que, en la imagen anterior, se muestra encima de la mediana) representa el valor medio.
Si movemos el cursor encima del violín se muestra una ventana flotante con información adicional:
En la imagen anterior vemos que tenemos 153 muestras (153 precios correspondientes a otros tantos productos), que el valor máximo es de 1.700€, el valor medio es de 731.54€, etc. Es posible añadir datos adicionales en <em>Formato > Default Tooltip Details</em>. Téngase en cuenta que estos valores hacen referencia a la estimación KDE, no a los valores en sí. Por ejemplo, el precio máximo es de 1.347€, no 1.700€ (ya se ha comentado que la línea vertical en el centro del violín sí representa esos valores mínimo y máximo).
Pero podemos estar interesados no en conocer la distribución de los precios, sino en cómo otra variable se distribuye en función de los precios. Por ejemplo, si quisiéramos saber cómo se reparten nuestros beneficios en función del precio del producto, tendríamos que llevar nuestra medida <em>Margin</em> (suma del beneficio derivado de cada venta) a <em>Measure Data</em> y dejar el campo <em>Price</em> (precio de cada producto) en el campo de la visualización <em>Sampling</em>:
La visualización nos indica que los beneficios provienen principalmente de la venta de productos cuyos precios rondan los 200€ y los 800€ (aproximadamente).
Podemos, además, desglosar el violín según otra dimensión, por ejemplo, la categoría de cada producto. Para ello podemos llevar el campo <em>Category</em> de nuestro modelo de datos al campo <em>Category</em> de la visualización:
Podemos comprobar cómo de un simple vistazo es posible hacerse una idea de cómo se reparten nuestros beneficios según el precio del producto y de su categoría.
Es posible aplicar colores a cada uno de los violines en <em>Formato > Data Colors > By Category</em>:
La visualización permite un alto grado de configuración: tipo de kernel a aplicar, el bandwidth, el criterio de ordenación de las categorías, el tipo de gráfica a mostrar en el interior del violín (que, por defecto, ya hemos visto que es una "caja"), se pueden personalizar los ejes, etc.
Se trata de una visualización muy completa y altamente personalizable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '53b83cfc-accb-4d6c-9fed-259c43682e62') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Los gráficos de violín como los ofrecidos por esta visualización, <strong>Violin Plot</strong>, nos permiten mostrar la distribución de una variable combinando la funcionalidad ofrecida por los clásicos gráficos de caja y los de densidad kernel (KDE).
La configuración de esta visualización es muy sencilla, apenas tres campos:
Supongamos que queremos conocer la distribución de los precios de los productos (qué precios son más o menos frecuentes, etc.). Bastaría con llevar el campo <em>Price</em> de nuestra tabla de productos tanto al campo <em>Measure Data</em> como al campo <em>Sampling</em>:
Visualmente ya se aprecia, por ejemplo, que la mayor parte de los precios rondan los 750€ (valor del eje vertical en la zona más ancha del violín) y que hay más productos con precios bajos que con precios altos (pues la zona inferior del violín es más ancha que la zona superior).
La caja interior muestra el valor de la mediana (raya horizontal blanca) y el primer y tercer cuantil (límites inferior y superior de la caja): es decir, la caja representa el rango intercuantil de la distribución. El extremo superior e inferior de la línea vertical que se incluye en el interior del violín representan los valores máximos y mínimos de los datos, y el círculo (que, en la imagen anterior, se muestra encima de la mediana) representa el valor medio.
Si movemos el cursor encima del violín se muestra una ventana flotante con información adicional:
En la imagen anterior vemos que tenemos 153 muestras (153 precios correspondientes a otros tantos productos), que el valor máximo es de 1.700€, el valor medio es de 731.54€, etc. Es posible añadir datos adicionales en <em>Formato > Default Tooltip Details</em>. Téngase en cuenta que estos valores hacen referencia a la estimación KDE, no a los valores en sí. Por ejemplo, el precio máximo es de 1.347€, no 1.700€ (ya se ha comentado que la línea vertical en el centro del violín sí representa esos valores mínimo y máximo).
Pero podemos estar interesados no en conocer la distribución de los precios, sino en cómo otra variable se distribuye en función de los precios. Por ejemplo, si quisiéramos saber cómo se reparten nuestros beneficios en función del precio del producto, tendríamos que llevar nuestra medida <em>Margin</em> (suma del beneficio derivado de cada venta) a <em>Measure Data</em> y dejar el campo <em>Price</em> (precio de cada producto) en el campo de la visualización <em>Sampling</em>:
La visualización nos indica que los beneficios provienen principalmente de la venta de productos cuyos precios rondan los 200€ y los 800€ (aproximadamente).
Podemos, además, desglosar el violín según otra dimensión, por ejemplo, la categoría de cada producto. Para ello podemos llevar el campo <em>Category</em> de nuestro modelo de datos al campo <em>Category</em> de la visualización:
Podemos comprobar cómo de un simple vistazo es posible hacerse una idea de cómo se reparten nuestros beneficios según el precio del producto y de su categoría.
Es posible aplicar colores a cada uno de los violines en <em>Formato > Data Colors > By Category</em>:
La visualización permite un alto grado de configuración: tipo de kernel a aplicar, el bandwidth, el criterio de ordenación de las categorías, el tipo de gráfica a mostrar en el interior del violín (que, por defecto, ya hemos visto que es una "caja"), se pueden personalizar los ejes, etc.
Se trata de una visualización muy completa y altamente personalizable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '53b83cfc-accb-4d6c-9fed-259c43682e62') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Los gráficos de violín como los ofrecidos por esta visualización, <strong>Violin Plot</strong>, nos permiten mostrar la distribución de una variable combinando la funcionalidad ofrecida por los clásicos gráficos de caja y los de densidad kernel (KDE).
La configuración de esta visualización es muy sencilla, apenas tres campos:
Supongamos que queremos conocer la distribución de los precios de los productos (qué precios son más o menos frecuentes, etc.). Bastaría con llevar el campo <em>Price</em> de nuestra tabla de productos tanto al campo <em>Measure Data</em> como al campo <em>Sampling</em>:
Visualmente ya se aprecia, por ejemplo, que la mayor parte de los precios rondan los 750€ (valor del eje vertical en la zona más ancha del violín) y que hay más productos con precios bajos que con precios altos (pues la zona inferior del violín es más ancha que la zona superior).
La caja interior muestra el valor de la mediana (raya horizontal blanca) y el primer y tercer cuantil (límites inferior y superior de la caja): es decir, la caja representa el rango intercuantil de la distribución. El extremo superior e inferior de la línea vertical que se incluye en el interior del violín representan los valores máximos y mínimos de los datos, y el círculo (que, en la imagen anterior, se muestra encima de la mediana) representa el valor medio.
Si movemos el cursor encima del violín se muestra una ventana flotante con información adicional:
En la imagen anterior vemos que tenemos 153 muestras (153 precios correspondientes a otros tantos productos), que el valor máximo es de 1.700€, el valor medio es de 731.54€, etc. Es posible añadir datos adicionales en <em>Formato > Default Tooltip Details</em>. Téngase en cuenta que estos valores hacen referencia a la estimación KDE, no a los valores en sí. Por ejemplo, el precio máximo es de 1.347€, no 1.700€ (ya se ha comentado que la línea vertical en el centro del violín sí representa esos valores mínimo y máximo).
Pero podemos estar interesados no en conocer la distribución de los precios, sino en cómo otra variable se distribuye en función de los precios. Por ejemplo, si quisiéramos saber cómo se reparten nuestros beneficios en función del precio del producto, tendríamos que llevar nuestra medida <em>Margin</em> (suma del beneficio derivado de cada venta) a <em>Measure Data</em> y dejar el campo <em>Price</em> (precio de cada producto) en el campo de la visualización <em>Sampling</em>:
La visualización nos indica que los beneficios provienen principalmente de la venta de productos cuyos precios rondan los 200€ y los 800€ (aproximadamente).
Podemos, además, desglosar el violín según otra dimensión, por ejemplo, la categoría de cada producto. Para ello podemos llevar el campo <em>Category</em> de nuestro modelo de datos al campo <em>Category</em> de la visualización:
Podemos comprobar cómo de un simple vistazo es posible hacerse una idea de cómo se reparten nuestros beneficios según el precio del producto y de su categoría.
Es posible aplicar colores a cada uno de los violines en <em>Formato > Data Colors > By Category</em>:
La visualización permite un alto grado de configuración: tipo de kernel a aplicar, el bandwidth, el criterio de ordenación de las categorías, el tipo de gráfica a mostrar en el interior del violín (que, por defecto, ya hemos visto que es una "caja"), se pueden personalizar los ejes, etc.
Se trata de una visualización muy completa y altamente personalizable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '53b83cfc-accb-4d6c-9fed-259c43682e62') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Los gráficos de violín como los ofrecidos por esta visualización, <strong>Violin Plot</strong>, nos permiten mostrar la distribución de una variable combinando la funcionalidad ofrecida por los clásicos gráficos de caja y los de densidad kernel (KDE).
La configuración de esta visualización es muy sencilla, apenas tres campos:
Supongamos que queremos conocer la distribución de los precios de los productos (qué precios son más o menos frecuentes, etc.). Bastaría con llevar el campo <em>Price</em> de nuestra tabla de productos tanto al campo <em>Measure Data</em> como al campo <em>Sampling</em>:
Visualmente ya se aprecia, por ejemplo, que la mayor parte de los precios rondan los 750€ (valor del eje vertical en la zona más ancha del violín) y que hay más productos con precios bajos que con precios altos (pues la zona inferior del violín es más ancha que la zona superior).
La caja interior muestra el valor de la mediana (raya horizontal blanca) y el primer y tercer cuantil (límites inferior y superior de la caja): es decir, la caja representa el rango intercuantil de la distribución. El extremo superior e inferior de la línea vertical que se incluye en el interior del violín representan los valores máximos y mínimos de los datos, y el círculo (que, en la imagen anterior, se muestra encima de la mediana) representa el valor medio.
Si movemos el cursor encima del violín se muestra una ventana flotante con información adicional:
En la imagen anterior vemos que tenemos 153 muestras (153 precios correspondientes a otros tantos productos), que el valor máximo es de 1.700€, el valor medio es de 731.54€, etc. Es posible añadir datos adicionales en <em>Formato > Default Tooltip Details</em>. Téngase en cuenta que estos valores hacen referencia a la estimación KDE, no a los valores en sí. Por ejemplo, el precio máximo es de 1.347€, no 1.700€ (ya se ha comentado que la línea vertical en el centro del violín sí representa esos valores mínimo y máximo).
Pero podemos estar interesados no en conocer la distribución de los precios, sino en cómo otra variable se distribuye en función de los precios. Por ejemplo, si quisiéramos saber cómo se reparten nuestros beneficios en función del precio del producto, tendríamos que llevar nuestra medida <em>Margin</em> (suma del beneficio derivado de cada venta) a <em>Measure Data</em> y dejar el campo <em>Price</em> (precio de cada producto) en el campo de la visualización <em>Sampling</em>:
La visualización nos indica que los beneficios provienen principalmente de la venta de productos cuyos precios rondan los 200€ y los 800€ (aproximadamente).
Podemos, además, desglosar el violín según otra dimensión, por ejemplo, la categoría de cada producto. Para ello podemos llevar el campo <em>Category</em> de nuestro modelo de datos al campo <em>Category</em> de la visualización:
Podemos comprobar cómo de un simple vistazo es posible hacerse una idea de cómo se reparten nuestros beneficios según el precio del producto y de su categoría.
Es posible aplicar colores a cada uno de los violines en <em>Formato > Data Colors > By Category</em>:
La visualización permite un alto grado de configuración: tipo de kernel a aplicar, el bandwidth, el criterio de ordenación de las categorías, el tipo de gráfica a mostrar en el interior del violín (que, por defecto, ya hemos visto que es una "caja"), se pueden personalizar los ejes, etc.
Se trata de una visualización muy completa y altamente personalizable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '53b83cfc-accb-4d6c-9fed-259c43682e62') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Los gráficos de violín como los ofrecidos por esta visualización, <strong>Violin Plot</strong>, nos permiten mostrar la distribución de una variable combinando la funcionalidad ofrecida por los clásicos gráficos de caja y los de densidad kernel (KDE).
La configuración de esta visualización es muy sencilla, apenas tres campos:
Supongamos que queremos conocer la distribución de los precios de los productos (qué precios son más o menos frecuentes, etc.). Bastaría con llevar el campo <em>Price</em> de nuestra tabla de productos tanto al campo <em>Measure Data</em> como al campo <em>Sampling</em>:
Visualmente ya se aprecia, por ejemplo, que la mayor parte de los precios rondan los 750€ (valor del eje vertical en la zona más ancha del violín) y que hay más productos con precios bajos que con precios altos (pues la zona inferior del violín es más ancha que la zona superior).
La caja interior muestra el valor de la mediana (raya horizontal blanca) y el primer y tercer cuantil (límites inferior y superior de la caja): es decir, la caja representa el rango intercuantil de la distribución. El extremo superior e inferior de la línea vertical que se incluye en el interior del violín representan los valores máximos y mínimos de los datos, y el círculo (que, en la imagen anterior, se muestra encima de la mediana) representa el valor medio.
Si movemos el cursor encima del violín se muestra una ventana flotante con información adicional:
En la imagen anterior vemos que tenemos 153 muestras (153 precios correspondientes a otros tantos productos), que el valor máximo es de 1.700€, el valor medio es de 731.54€, etc. Es posible añadir datos adicionales en <em>Formato > Default Tooltip Details</em>. Téngase en cuenta que estos valores hacen referencia a la estimación KDE, no a los valores en sí. Por ejemplo, el precio máximo es de 1.347€, no 1.700€ (ya se ha comentado que la línea vertical en el centro del violín sí representa esos valores mínimo y máximo).
Pero podemos estar interesados no en conocer la distribución de los precios, sino en cómo otra variable se distribuye en función de los precios. Por ejemplo, si quisiéramos saber cómo se reparten nuestros beneficios en función del precio del producto, tendríamos que llevar nuestra medida <em>Margin</em> (suma del beneficio derivado de cada venta) a <em>Measure Data</em> y dejar el campo <em>Price</em> (precio de cada producto) en el campo de la visualización <em>Sampling</em>:
La visualización nos indica que los beneficios provienen principalmente de la venta de productos cuyos precios rondan los 200€ y los 800€ (aproximadamente).
Podemos, además, desglosar el violín según otra dimensión, por ejemplo, la categoría de cada producto. Para ello podemos llevar el campo <em>Category</em> de nuestro modelo de datos al campo <em>Category</em> de la visualización:
Podemos comprobar cómo de un simple vistazo es posible hacerse una idea de cómo se reparten nuestros beneficios según el precio del producto y de su categoría.
Es posible aplicar colores a cada uno de los violines en <em>Formato > Data Colors > By Category</em>:
La visualización permite un alto grado de configuración: tipo de kernel a aplicar, el bandwidth, el criterio de ordenación de las categorías, el tipo de gráfica a mostrar en el interior del violín (que, por defecto, ya hemos visto que es una "caja"), se pueden personalizar los ejes, etc.
Se trata de una visualización muy completa y altamente personalizable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'ec6069dd-262f-44a0-ac49-10ffa0563110') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'ec6069dd-262f-44a0-ac49-10ffa0563110') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'ec6069dd-262f-44a0-ac49-10ffa0563110') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'ec6069dd-262f-44a0-ac49-10ffa0563110') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'ec6069dd-262f-44a0-ac49-10ffa0563110') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '87668183-48fc-4f5a-a25e-44779058a871') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '87668183-48fc-4f5a-a25e-44779058a871') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '87668183-48fc-4f5a-a25e-44779058a871') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '87668183-48fc-4f5a-a25e-44779058a871') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '87668183-48fc-4f5a-a25e-44779058a871') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'a9469fac-5366-4a63-acc8-32caba5c304b') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'a9469fac-5366-4a63-acc8-32caba5c304b') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'a9469fac-5366-4a63-acc8-32caba5c304b') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'a9469fac-5366-4a63-acc8-32caba5c304b') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'a9469fac-5366-4a63-acc8-32caba5c304b') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '99fb6570-a29a-401d-bbfc-a54c47070870') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '99fb6570-a29a-401d-bbfc-a54c47070870') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '99fb6570-a29a-401d-bbfc-a54c47070870') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '99fb6570-a29a-401d-bbfc-a54c47070870') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '99fb6570-a29a-401d-bbfc-a54c47070870') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'f81e0428-b518-4cb4-98b8-3d6873960a01') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'f81e0428-b518-4cb4-98b8-3d6873960a01') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'f81e0428-b518-4cb4-98b8-3d6873960a01') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'f81e0428-b518-4cb4-98b8-3d6873960a01') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'f81e0428-b518-4cb4-98b8-3d6873960a01') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '9e553b17-59c7-4eee-8f95-db32dead548a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '9e553b17-59c7-4eee-8f95-db32dead548a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '9e553b17-59c7-4eee-8f95-db32dead548a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '9e553b17-59c7-4eee-8f95-db32dead548a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '9e553b17-59c7-4eee-8f95-db32dead548a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '460ea85f-b422-4a9a-a5ad-dc78bf508722') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '460ea85f-b422-4a9a-a5ad-dc78bf508722') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '460ea85f-b422-4a9a-a5ad-dc78bf508722') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '460ea85f-b422-4a9a-a5ad-dc78bf508722') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '460ea85f-b422-4a9a-a5ad-dc78bf508722') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '62d88b1a-2b7e-476a-8374-8f41a3822b75') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '62d88b1a-2b7e-476a-8374-8f41a3822b75') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '62d88b1a-2b7e-476a-8374-8f41a3822b75') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '62d88b1a-2b7e-476a-8374-8f41a3822b75') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '62d88b1a-2b7e-476a-8374-8f41a3822b75') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '7574caa1-499e-42f8-8c74-1f14336b6047') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '7574caa1-499e-42f8-8c74-1f14336b6047') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '7574caa1-499e-42f8-8c74-1f14336b6047') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '7574caa1-499e-42f8-8c74-1f14336b6047') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '7574caa1-499e-42f8-8c74-1f14336b6047') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>As Timeline</strong> nos permite llevar a una línea de tiempo diferentes elementos caracterizados por una fecha de arranque y otra de finalización. La configuración es, además, muy sencilla e intuitiva.
Los datos con que queremos representar son los siguientes:
El campo <em>Employee Id</em> está asociado a una tabla de empleados en la que se incluyen, entre otros datos, el nombre del empleado (campo <em>Full Name</em>) y el departamento al que pertenece (campo <em>Department</em>).
Los campos que controlan la configuración de la visualización son los mostrados en la siguiente imagen:
Tras crear una instancia de la visualización, arrastremos el campo <em>Full Name</em> (nombre del empleado) al campo de la visualización <em>Entity</em>, y los campos <em>Start</em> y <em>End</em> de nuestro modelo de datos a los campos <em>Start Date</em> y <em>End Date</em> de la visualización, respectivamente. La visualización muestra el siguiente aspecto:
Es decir, con un par de clics ya tenemos una representación temporal de las asignaciones a los empleados en cuestión.
Es posible añadir una dimensión adicional que nos permita clasificar nuestros "recursos" (empleados en este ejemplo) utilizando el campo de la visualización <em>Category</em>. Llevemos a este campo el campo <em>Department</em> de nuestra tabla de datos, campo que contiene el departamento al que pertenece cada empleado. Téngase en cuenta que cada empleado pertenece a un único departamento:
Vemos que se ha añadido la "categoría" a las etiquetas de los empleados. Esto es configurable en <em>Formato > Behavior > Stacked</em> (véase siguiente imagen). Por otro lado, al mover el cursor encima de una de las barras horizontales asociadas a un empleado se muestra la información asociada:
Sin embargo, si la "categoría" añadida no es única para cada empleado, el comportamiento de la visualización cambia. Supongamos que nuestro empleados van a trabajar en el proyecto tanto como beta-testers como desarrolladores, y que cada una de las asignaciones (periodos de tiempo) los van a asociar a uno de los dos roles. Activemos la opción <em>Stacked</em> que hemos visto en <em>Formato > Behavior</em> y llevemos al campo <em>Category</em> de la visualización el campo <em>Role</em> de nuestra tabla:
Ahora la visualización está mostrando una fila para cada una de las combinaciones de empleado y role. Si desactivamos la opción <em>Stacked</em>, las filas correspondientes a cada empleado se muestran solapadas:
Podemos llevar al campo <em>Overlay</em> campos (uno o más) que queramos que se muestren sobre las barras. Por ejemplo, si llevamos el identificador del empleado, el resultado es el siguiente:
Estas etiquetas que se muestran son configurables en <em>Formato > Overlay text options</em>. El orden en el que se muestran dentro de una barra, sin embargo, es automático (no coincide con el orden en el que llevamos los campos de nuestro modelo de datos al campo de la visualización)
Las selecciones no tienen un comportamiento especialmente lógico: un clic en uno de los nombres de los empleados (cabeceras de filas) no filtra la tabla de empleados ni el resto de visualizaciones que haya en nuestro informe (de hecho la visualización se reordena de forma un tanto inexplicable al hacer clic en una de estas cabeceras). Pero un clic en una de las barras horizontales sí lo hace. Un segundo clic en la misma barra debería deseleccionar al empleado en cuestión, pero no ocurre así: Hay que hacer clic en alguna de las etiquetas de la leyenda, por ejemplo, para que esto ocurra. Hay ciertas opciones para configurar las selecciones en <em>Formato > Multiselect</em>.
Por otro lado, la selección de uno de los recursos en otra visualización sí va a filtrar el <em>As Timeline</em>.
Una limitación de la visualización tiene que ver con el período siendo mostrado: si incluimos asignaciones de períodos lejanos, se muestran todos, con independencia de la escala que haya que aplicar. Por ejemplo, si una de las asignaciones de los datos con los que estamos trabajando se ha retrasado un año, la visualización muestra el siguiente aspecto:
La opción más conveniente es recurrir a una segmentación temporal adicional.
Otro factor a considerar es que el campo a llevar a <em>End Date</em> no es la última fecha en la que el recurso en cuestión está asignado, sino el primer día en el que ya no lo está. Por ejemplo, si un recurso está asignado solo un día, el 5/7/2019, habría que llevar a <em>Start Date</em> el valor 5/7/2019 y a End Date el valor 6/7/2019. De otra forma no se mostraría en la gráfica.
Aun con algunas limitaciones, se trata de una visualización muy práctica y recomendable.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'b03e9d10-566b-424b-9bee-4bb908574f7d') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'b03e9d10-566b-424b-9bee-4bb908574f7d') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'b03e9d10-566b-424b-9bee-4bb908574f7d') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'b03e9d10-566b-424b-9bee-4bb908574f7d') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '7307fb36-22f9-4773-8989-0f46bec0f2f3') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '7307fb36-22f9-4773-8989-0f46bec0f2f3') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '7307fb36-22f9-4773-8989-0f46bec0f2f3') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '7307fb36-22f9-4773-8989-0f46bec0f2f3') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '96f16f95-c6a3-4f81-a9b0-285ef6c712ad') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '96f16f95-c6a3-4f81-a9b0-285ef6c712ad') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '96f16f95-c6a3-4f81-a9b0-285ef6c712ad') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '96f16f95-c6a3-4f81-a9b0-285ef6c712ad') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '4ebe790c-0010-4639-b944-655537d2018a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '4ebe790c-0010-4639-b944-655537d2018a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '4ebe790c-0010-4639-b944-655537d2018a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '4ebe790c-0010-4639-b944-655537d2018a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'abd1bab5-76dc-4a19-b6ed-d6a0f1909ec2') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'abd1bab5-76dc-4a19-b6ed-d6a0f1909ec2') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'abd1bab5-76dc-4a19-b6ed-d6a0f1909ec2') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'abd1bab5-76dc-4a19-b6ed-d6a0f1909ec2') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '34a39660-d8b6-470e-9057-4be466f464d9') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '34a39660-d8b6-470e-9057-4be466f464d9') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '34a39660-d8b6-470e-9057-4be466f464d9') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '34a39660-d8b6-470e-9057-4be466f464d9') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '3d233e14-edb8-4f56-81d3-c471a8a31c29') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '3d233e14-edb8-4f56-81d3-c471a8a31c29') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '3d233e14-edb8-4f56-81d3-c471a8a31c29') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '3d233e14-edb8-4f56-81d3-c471a8a31c29') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Impact Bubble Chart</strong> permite la creación de gráficos de dispersión pudiendo especificar, entre otras cosas, cuál debe ser el tamaño de la burbuja que representa cada dato.
Veamos un ejemplo: tras llevar la visualización al lienzo arrastramos a ésta nuestros campos <em>Region</em> (región en la que se realiza una venta), <em>Average Margin</em> (margen medio) y <em>Sales</em> (ventas realizadas):
Por muy atractivos que sean los colores escogidos, nos encontramos con los primeros problemas: no es posible regular el tamaño por defecto de las burbujas y, además, ni el grado de transparencia de éstas ni el tamaño de la fuente mostrada dentro de las burbujas son configurables.
Esta es la configuración de la visualización:
Si movemos el cursor encima de una burbuja, se muestra la clásica ventana flotante con la información relativa a burbuja en cuestión. Eso si puedes escoger la burbuja en cuestión pues, como se ha comentado, en muchas ocasiones quedará oculta por otras. Curiosamente en la ventana flotante no se hace referencia a los nombres de los campos o medidas, muestran las etiquetas "X-Axis" e "Y-Axis":
Un problema adicional que surge a veces es que las etiquetas del eje X aparecen superpuestas, siendo imposible distinguirlas (no es posible configurar su tamaño, densidad o inclinación).
Podemos regular el tamaño relativo de las burbujas llevando un campo de nuestro modelo de datos al campo <em>Size</em> de la visualización, lo que frecuentemente no hace más que empeorar la visibilidad de las burbujas. Así, si queremos que cada burbuja tenga un tamaño proporcional al número de unidades vendidas, arrastraríamos el campo <em>Units</em> al campo <em>Size</em> de la visualización:
En el ejemplo anterior resulta muy difícil sacar conclusiones útiles (y no hay forma de modificar estos tamaños).
El campo <em>Play Axis</em> permite llevar a la visualización un eje adicional (típicamente será el tiempo) para mostrar la evolución de nuestros datos a lo largo de esta nueva dimensión:
Los campos <em>Left Bar</em> y <em>Right Bar</em> nos permiten llevar dos campos cuantitativos que se mostrarán como barras a la derecha y a la izquierda de cada burbuja (en la siguiente imagen se ha eliminado el campo situado en <em>Size</em> para poder ver un poco mejor las burbujas):
Un problema de estas barras es que su longitud es proporcional a la misma métrica: si tenemos precios y costes en ambas barras y los dos grupos de cifras son de la misma magnitud, distinguiremos las barras. Por el contrario, si en una barra estamos midiendo precios del orden de los cientos de euros y, en la otra, unidades del orden de 1-10, esta última barra no se distinguirá.
Como se aprecia en la siguiente captura de pantalla, la configuración de esta visualización es bastante limitada, pudiendo escoger apenas los tres colores con los que se muestran las burbujas, y los valores límites de los ejes X e Y.
Aun cuando es cierto que el aspecto gráfico es relativamente atractivo, lo cierto es que esta visualización no mejora en prácticamente nada el gráfico de dispersión integrado de Power BI, siendo mucho menos configurable y presentando demasiadas limitaciones.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'ba4db18d-f6d2-4ab6-b668-7349a4e2225c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'ba4db18d-f6d2-4ab6-b668-7349a4e2225c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'ba4db18d-f6d2-4ab6-b668-7349a4e2225c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'ba4db18d-f6d2-4ab6-b668-7349a4e2225c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'ba4db18d-f6d2-4ab6-b668-7349a4e2225c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'c4f8c0e7-7fe7-47bb-89ba-1ad9ce5904aa') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'c4f8c0e7-7fe7-47bb-89ba-1ad9ce5904aa') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'c4f8c0e7-7fe7-47bb-89ba-1ad9ce5904aa') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'c4f8c0e7-7fe7-47bb-89ba-1ad9ce5904aa') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'c4f8c0e7-7fe7-47bb-89ba-1ad9ce5904aa') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'a5db6b76-1069-4a9d-9ab8-c290169f678c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'a5db6b76-1069-4a9d-9ab8-c290169f678c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'a5db6b76-1069-4a9d-9ab8-c290169f678c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'a5db6b76-1069-4a9d-9ab8-c290169f678c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'a5db6b76-1069-4a9d-9ab8-c290169f678c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '8feb145a-7083-477e-b624-fdb20e7caa25') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '8feb145a-7083-477e-b624-fdb20e7caa25') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '8feb145a-7083-477e-b624-fdb20e7caa25') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '8feb145a-7083-477e-b624-fdb20e7caa25') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '8feb145a-7083-477e-b624-fdb20e7caa25') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'c61cea56-16c8-4682-8624-66e50c28c026') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'c61cea56-16c8-4682-8624-66e50c28c026') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'c61cea56-16c8-4682-8624-66e50c28c026') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'c61cea56-16c8-4682-8624-66e50c28c026') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'c61cea56-16c8-4682-8624-66e50c28c026') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '9661e99f-bb16-4683-a230-2c76b2bb4fb4') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '9661e99f-bb16-4683-a230-2c76b2bb4fb4') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '9661e99f-bb16-4683-a230-2c76b2bb4fb4') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '9661e99f-bb16-4683-a230-2c76b2bb4fb4') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '9661e99f-bb16-4683-a230-2c76b2bb4fb4') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '1b21aa98-edd4-4690-8c60-a314e4c2be2c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '1b21aa98-edd4-4690-8c60-a314e4c2be2c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '1b21aa98-edd4-4690-8c60-a314e4c2be2c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '1b21aa98-edd4-4690-8c60-a314e4c2be2c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '1b21aa98-edd4-4690-8c60-a314e4c2be2c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '4111d732-3b08-414f-8c6e-e39fbf1e9eb4') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '4111d732-3b08-414f-8c6e-e39fbf1e9eb4') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '4111d732-3b08-414f-8c6e-e39fbf1e9eb4') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '4111d732-3b08-414f-8c6e-e39fbf1e9eb4') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '4111d732-3b08-414f-8c6e-e39fbf1e9eb4') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'a13f6d0f-36c0-47b3-98bc-0722dd8ecbb6') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'a13f6d0f-36c0-47b3-98bc-0722dd8ecbb6') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'a13f6d0f-36c0-47b3-98bc-0722dd8ecbb6') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'a13f6d0f-36c0-47b3-98bc-0722dd8ecbb6') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'a13f6d0f-36c0-47b3-98bc-0722dd8ecbb6') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Box and Whisker chart by MAQ Software</strong> ofrece innumerables opciones para visualizar la distribución de nuestros datos. Para comenzar, llevemos la visualización a nuestro lienzo y arrastremos a ella un campo categórico (el campo que contiene los nombres de las subcategorías en nuestro caso) y una medida (margen por categoría):
Vemos el típico diagrama de caja mostrando los cuartiles de la distribución. Los colores a usar en la caja pueden configurarse en <em>Formato > Box options</em> (véase siguiente imagen) y al mover el cursor encima de la caja o del eje vertical que la atraviesa se muestra una ventana flotante con información sobre al distribución:
Vemos que se muestra no solo los valores de los cuartiles, sino también información estadística como la media o el rango intercuantil.
Si echamos un vistazo a la configuración de la visualización...
...vemos que el campo <em>Subcategory</em> de nuestro modelo de datos se ha agregado al campo <em>Axis</em> de la visualización, y que la medida <em>Margin</em> ha ocupado el campo <em>Value</em>. Es decir, el campo <em>Axis</em> hace referencia al eje vertical en el que se muestran los valores que tome nuestro campo. Podemos comprobar esto moviendo el cursor por encima de los puntos verdes que representan nuestros valores (subcategorías en el ejemplo):
El campo <em>Axis Category I</em>, a su vez, hace referencia al eje X, que nos permite desglosar nuestro datos según otra dimensión. Si, por ejemplo, arrastramos a este campo <em>Axis Category I</em> el campo <em>Country</em> de nuestros datos (conteniendo los nombres de los países en los que se realizan las ventas), el resultado es el siguiente:
Ahora vemos la distribución del margen por subcategoría y por país. La visualización puede mostrarse también horizontalmente (<em>Formato > Orientation</em>):
En <em>Formato > Box options > Whisker type</em> podemos configurar cómo queremos que se calculen los "caps" de cada caja (los límites superior e inferior del eje que atraviesa cada caja): Por defecto se considera la opción "<em>Min/Max</em>", de forma que son los valores mínimo y máximo de nuestros valores los que establecen los valores de los caps, pero podemos escoger la opción <em>1.5 IQR</em>, por ejemplo, que limita los caps a 1.5 veces el rango intercuantil, o la opción <em>One Standard Deviation</em>, que limita los caps a una desviación estándar (considerando los puntos más alejados como "<em>outliers</em>"):
Estos outliers, una vez identificados (sea cual sea la opción escogida) pueden ocultarse en <em>Formato > Box Options > Outliers</em>:
Además de las opciones mencionadas ("<em>Min/Max</em>" , "<em>= 1.5 IRQ</em>" y "<em>One Standard Deviation</em>") hay otra opción de difícil interpretación ("<em>< 1.5 IRQ</em>") y otra <em>Custom</em> que permite especificar el mínimo y máximo percentil que limitarán la posición de los caps (fuera de los cuáles los valores se consideran <em>outliers</em>).
En las imágenes mostradas hasta ahora puede verse un círculo blanco en el interior de las cajas que representa el valor medio de los valores representados. Esto puede activarse o desactivarse en <em>Formato > Mean</em>.
Los ejes X e Y son configurables también (valores mínimo y máximo en el eje Y, número de cifras decimales a mostrar, color de la fuente, tamaño, etc., así como se puede mostrar o no el grid.
El campo de la visualización <em>Axis category II</em> permite replicar la gráfica desagregando los datos según una dimensión adicional (lo que frecuentemente se denomina <em>faces</em>). Así, si llevamos el campo <em>Gender</em> (que contiene el género de los clientes) a este campo, obtenemos el siguiente resultado:
En fin, montones de opciones disponibles para analizar la distribución de nuestros datos. Visualización muy recomendada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'e23d7bf9-8c5f-4126-bd5f-3251207719c4') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>TreeViz</strong>, permite la creación de árboles jerárquicos que muestren información sobre una o más métricas. Para ello, la visualización ofrece dos únicos campos: <em>Category Data</em>, al que llevar los campos que compondrán la jerarquía a representar, y <em>Measure Data</em>, al que llevar una o varias métricas (la primera será la mostrada en los nodos, las demás serán visibles solo en la ventana flotante que se muestra al mover el cursor encima de ellos). Por ejemplo, si queremos visualizar las ventas por país y sexo del comprador, bastaría con configurar la visualización de la siguiente forma:
El resultado es el siguiente:
Un clic en alguno de los símbolos que se muestran en la parte inferior de los nodos (la doble flecha apuntando hacia abajo) despliega el nodo en cuestión para mostrar el siguiente nivel de la jerarquía:
El símbolo equivalente apuntando hacia arriba sirve para colapsar dicha rama del árbol, y los mismos símbolos apuntando a la izquierda o a la derecha esconden o muestran los nodos que representan los menores valores del nivel.
Como se muestra en la siguiente captura de pantalla, al mover el cursor encima de un nodo se muestran los valores asociados a las métricas indicadas para el nodo en cuestión:
Una barra verde en el interior de cada nodo indica la proporción de la métrica principal (con respecto al máximo de dicha métrica en el nivel en el que se encuentre). Si nos encontramos en el segundo nivel de la jerarquía (o inferior), se muestran tantas barras verdes como sea necesario para mostrar el porcentaje que la métrica representa con respecto al máximo de cada nivel (actual o anterior). Estos porcentajes se muestran también al mover el cursor encima del nodo, tal y como puede apreciarse en la imagen anterior, en la que puede verse cómo el porcentaje de 25.2% ha sustituido a la cifra de ventas de Italia (1.248.372€).
La visualización solo ofrece dos características personalizables: si se muestran o no los valores en los nodos, y el número de nodos a esconder o mostrar usando los referidos iconos que apuntan a la derecha e izquierda.
Aun cuando la visualización resulta de gran utilidad en ciertos entornos, su mayor limitación tiene que ver son su aspecto: los colores no se adaptan al tema que se esté usando, no se pueden personalizar de ninguna forma (y las elecciones hechas pueden calificarse de bastante poco atractivas), y no ofrece un diseño coherente con el entorno ofrecido por Power BI. Como ejemplo, véase en la imagen anterior la ventana flotante que se muestra al mover el cursor por encima de un nodo con fondo azul y texto en blanco: ni es personalizable ni guarda coherencia alguna con el esquema gráfico de las demás ventanas de este estilo que estaremos usando en nuestros informes.
También se agradecerían herramientas adicionales, como poder configurar el árbol de forma que al expandir una rama se colapsasen (o no) las demás ramas del mismo nivel, por ejemplo. De otra forma, en ocasiones el árbol es tan grande que resulta complicado moverse por él.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'e23d7bf9-8c5f-4126-bd5f-3251207719c4') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>TreeViz</strong>, permite la creación de árboles jerárquicos que muestren información sobre una o más métricas. Para ello, la visualización ofrece dos únicos campos: <em>Category Data</em>, al que llevar los campos que compondrán la jerarquía a representar, y <em>Measure Data</em>, al que llevar una o varias métricas (la primera será la mostrada en los nodos, las demás serán visibles solo en la ventana flotante que se muestra al mover el cursor encima de ellos). Por ejemplo, si queremos visualizar las ventas por país y sexo del comprador, bastaría con configurar la visualización de la siguiente forma:
El resultado es el siguiente:
Un clic en alguno de los símbolos que se muestran en la parte inferior de los nodos (la doble flecha apuntando hacia abajo) despliega el nodo en cuestión para mostrar el siguiente nivel de la jerarquía:
El símbolo equivalente apuntando hacia arriba sirve para colapsar dicha rama del árbol, y los mismos símbolos apuntando a la izquierda o a la derecha esconden o muestran los nodos que representan los menores valores del nivel.
Como se muestra en la siguiente captura de pantalla, al mover el cursor encima de un nodo se muestran los valores asociados a las métricas indicadas para el nodo en cuestión:
Una barra verde en el interior de cada nodo indica la proporción de la métrica principal (con respecto al máximo de dicha métrica en el nivel en el que se encuentre). Si nos encontramos en el segundo nivel de la jerarquía (o inferior), se muestran tantas barras verdes como sea necesario para mostrar el porcentaje que la métrica representa con respecto al máximo de cada nivel (actual o anterior). Estos porcentajes se muestran también al mover el cursor encima del nodo, tal y como puede apreciarse en la imagen anterior, en la que puede verse cómo el porcentaje de 25.2% ha sustituido a la cifra de ventas de Italia (1.248.372€).
La visualización solo ofrece dos características personalizables: si se muestran o no los valores en los nodos, y el número de nodos a esconder o mostrar usando los referidos iconos que apuntan a la derecha e izquierda.
Aun cuando la visualización resulta de gran utilidad en ciertos entornos, su mayor limitación tiene que ver son su aspecto: los colores no se adaptan al tema que se esté usando, no se pueden personalizar de ninguna forma (y las elecciones hechas pueden calificarse de bastante poco atractivas), y no ofrece un diseño coherente con el entorno ofrecido por Power BI. Como ejemplo, véase en la imagen anterior la ventana flotante que se muestra al mover el cursor por encima de un nodo con fondo azul y texto en blanco: ni es personalizable ni guarda coherencia alguna con el esquema gráfico de las demás ventanas de este estilo que estaremos usando en nuestros informes.
También se agradecerían herramientas adicionales, como poder configurar el árbol de forma que al expandir una rama se colapsasen (o no) las demás ramas del mismo nivel, por ejemplo. De otra forma, en ocasiones el árbol es tan grande que resulta complicado moverse por él.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'e23d7bf9-8c5f-4126-bd5f-3251207719c4') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>TreeViz</strong>, permite la creación de árboles jerárquicos que muestren información sobre una o más métricas. Para ello, la visualización ofrece dos únicos campos: <em>Category Data</em>, al que llevar los campos que compondrán la jerarquía a representar, y <em>Measure Data</em>, al que llevar una o varias métricas (la primera será la mostrada en los nodos, las demás serán visibles solo en la ventana flotante que se muestra al mover el cursor encima de ellos). Por ejemplo, si queremos visualizar las ventas por país y sexo del comprador, bastaría con configurar la visualización de la siguiente forma:
El resultado es el siguiente:
Un clic en alguno de los símbolos que se muestran en la parte inferior de los nodos (la doble flecha apuntando hacia abajo) despliega el nodo en cuestión para mostrar el siguiente nivel de la jerarquía:
El símbolo equivalente apuntando hacia arriba sirve para colapsar dicha rama del árbol, y los mismos símbolos apuntando a la izquierda o a la derecha esconden o muestran los nodos que representan los menores valores del nivel.
Como se muestra en la siguiente captura de pantalla, al mover el cursor encima de un nodo se muestran los valores asociados a las métricas indicadas para el nodo en cuestión:
Una barra verde en el interior de cada nodo indica la proporción de la métrica principal (con respecto al máximo de dicha métrica en el nivel en el que se encuentre). Si nos encontramos en el segundo nivel de la jerarquía (o inferior), se muestran tantas barras verdes como sea necesario para mostrar el porcentaje que la métrica representa con respecto al máximo de cada nivel (actual o anterior). Estos porcentajes se muestran también al mover el cursor encima del nodo, tal y como puede apreciarse en la imagen anterior, en la que puede verse cómo el porcentaje de 25.2% ha sustituido a la cifra de ventas de Italia (1.248.372€).
La visualización solo ofrece dos características personalizables: si se muestran o no los valores en los nodos, y el número de nodos a esconder o mostrar usando los referidos iconos que apuntan a la derecha e izquierda.
Aun cuando la visualización resulta de gran utilidad en ciertos entornos, su mayor limitación tiene que ver son su aspecto: los colores no se adaptan al tema que se esté usando, no se pueden personalizar de ninguna forma (y las elecciones hechas pueden calificarse de bastante poco atractivas), y no ofrece un diseño coherente con el entorno ofrecido por Power BI. Como ejemplo, véase en la imagen anterior la ventana flotante que se muestra al mover el cursor por encima de un nodo con fondo azul y texto en blanco: ni es personalizable ni guarda coherencia alguna con el esquema gráfico de las demás ventanas de este estilo que estaremos usando en nuestros informes.
También se agradecerían herramientas adicionales, como poder configurar el árbol de forma que al expandir una rama se colapsasen (o no) las demás ramas del mismo nivel, por ejemplo. De otra forma, en ocasiones el árbol es tan grande que resulta complicado moverse por él.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'e23d7bf9-8c5f-4126-bd5f-3251207719c4') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>TreeViz</strong>, permite la creación de árboles jerárquicos que muestren información sobre una o más métricas. Para ello, la visualización ofrece dos únicos campos: <em>Category Data</em>, al que llevar los campos que compondrán la jerarquía a representar, y <em>Measure Data</em>, al que llevar una o varias métricas (la primera será la mostrada en los nodos, las demás serán visibles solo en la ventana flotante que se muestra al mover el cursor encima de ellos). Por ejemplo, si queremos visualizar las ventas por país y sexo del comprador, bastaría con configurar la visualización de la siguiente forma:
El resultado es el siguiente:
Un clic en alguno de los símbolos que se muestran en la parte inferior de los nodos (la doble flecha apuntando hacia abajo) despliega el nodo en cuestión para mostrar el siguiente nivel de la jerarquía:
El símbolo equivalente apuntando hacia arriba sirve para colapsar dicha rama del árbol, y los mismos símbolos apuntando a la izquierda o a la derecha esconden o muestran los nodos que representan los menores valores del nivel.
Como se muestra en la siguiente captura de pantalla, al mover el cursor encima de un nodo se muestran los valores asociados a las métricas indicadas para el nodo en cuestión:
Una barra verde en el interior de cada nodo indica la proporción de la métrica principal (con respecto al máximo de dicha métrica en el nivel en el que se encuentre). Si nos encontramos en el segundo nivel de la jerarquía (o inferior), se muestran tantas barras verdes como sea necesario para mostrar el porcentaje que la métrica representa con respecto al máximo de cada nivel (actual o anterior). Estos porcentajes se muestran también al mover el cursor encima del nodo, tal y como puede apreciarse en la imagen anterior, en la que puede verse cómo el porcentaje de 25.2% ha sustituido a la cifra de ventas de Italia (1.248.372€).
La visualización solo ofrece dos características personalizables: si se muestran o no los valores en los nodos, y el número de nodos a esconder o mostrar usando los referidos iconos que apuntan a la derecha e izquierda.
Aun cuando la visualización resulta de gran utilidad en ciertos entornos, su mayor limitación tiene que ver son su aspecto: los colores no se adaptan al tema que se esté usando, no se pueden personalizar de ninguna forma (y las elecciones hechas pueden calificarse de bastante poco atractivas), y no ofrece un diseño coherente con el entorno ofrecido por Power BI. Como ejemplo, véase en la imagen anterior la ventana flotante que se muestra al mover el cursor por encima de un nodo con fondo azul y texto en blanco: ni es personalizable ni guarda coherencia alguna con el esquema gráfico de las demás ventanas de este estilo que estaremos usando en nuestros informes.
También se agradecerían herramientas adicionales, como poder configurar el árbol de forma que al expandir una rama se colapsasen (o no) las demás ramas del mismo nivel, por ejemplo. De otra forma, en ocasiones el árbol es tan grande que resulta complicado moverse por él.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'd008e6bd-5d78-419d-94fa-aa254c966d88') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>TreeViz</strong>, permite la creación de árboles jerárquicos que muestren información sobre una o más métricas. Para ello, la visualización ofrece dos únicos campos: <em>Category Data</em>, al que llevar los campos que compondrán la jerarquía a representar, y <em>Measure Data</em>, al que llevar una o varias métricas (la primera será la mostrada en los nodos, las demás serán visibles solo en la ventana flotante que se muestra al mover el cursor encima de ellos). Por ejemplo, si queremos visualizar las ventas por país y sexo del comprador, bastaría con configurar la visualización de la siguiente forma:
El resultado es el siguiente:
Un clic en alguno de los símbolos que se muestran en la parte inferior de los nodos (la doble flecha apuntando hacia abajo) despliega el nodo en cuestión para mostrar el siguiente nivel de la jerarquía:
El símbolo equivalente apuntando hacia arriba sirve para colapsar dicha rama del árbol, y los mismos símbolos apuntando a la izquierda o a la derecha esconden o muestran los nodos que representan los menores valores del nivel.
Como se muestra en la siguiente captura de pantalla, al mover el cursor encima de un nodo se muestran los valores asociados a las métricas indicadas para el nodo en cuestión:
Una barra verde en el interior de cada nodo indica la proporción de la métrica principal (con respecto al máximo de dicha métrica en el nivel en el que se encuentre). Si nos encontramos en el segundo nivel de la jerarquía (o inferior), se muestran tantas barras verdes como sea necesario para mostrar el porcentaje que la métrica representa con respecto al máximo de cada nivel (actual o anterior). Estos porcentajes se muestran también al mover el cursor encima del nodo, tal y como puede apreciarse en la imagen anterior, en la que puede verse cómo el porcentaje de 25.2% ha sustituido a la cifra de ventas de Italia (1.248.372€).
La visualización solo ofrece dos características personalizables: si se muestran o no los valores en los nodos, y el número de nodos a esconder o mostrar usando los referidos iconos que apuntan a la derecha e izquierda.
Aun cuando la visualización resulta de gran utilidad en ciertos entornos, su mayor limitación tiene que ver son su aspecto: los colores no se adaptan al tema que se esté usando, no se pueden personalizar de ninguna forma (y las elecciones hechas pueden calificarse de bastante poco atractivas), y no ofrece un diseño coherente con el entorno ofrecido por Power BI. Como ejemplo, véase en la imagen anterior la ventana flotante que se muestra al mover el cursor por encima de un nodo con fondo azul y texto en blanco: ni es personalizable ni guarda coherencia alguna con el esquema gráfico de las demás ventanas de este estilo que estaremos usando en nuestros informes.
También se agradecerían herramientas adicionales, como poder configurar el árbol de forma que al expandir una rama se colapsasen (o no) las demás ramas del mismo nivel, por ejemplo. De otra forma, en ocasiones el árbol es tan grande que resulta complicado moverse por él.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'd008e6bd-5d78-419d-94fa-aa254c966d88') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>TreeViz</strong>, permite la creación de árboles jerárquicos que muestren información sobre una o más métricas. Para ello, la visualización ofrece dos únicos campos: <em>Category Data</em>, al que llevar los campos que compondrán la jerarquía a representar, y <em>Measure Data</em>, al que llevar una o varias métricas (la primera será la mostrada en los nodos, las demás serán visibles solo en la ventana flotante que se muestra al mover el cursor encima de ellos). Por ejemplo, si queremos visualizar las ventas por país y sexo del comprador, bastaría con configurar la visualización de la siguiente forma:
El resultado es el siguiente:
Un clic en alguno de los símbolos que se muestran en la parte inferior de los nodos (la doble flecha apuntando hacia abajo) despliega el nodo en cuestión para mostrar el siguiente nivel de la jerarquía:
El símbolo equivalente apuntando hacia arriba sirve para colapsar dicha rama del árbol, y los mismos símbolos apuntando a la izquierda o a la derecha esconden o muestran los nodos que representan los menores valores del nivel.
Como se muestra en la siguiente captura de pantalla, al mover el cursor encima de un nodo se muestran los valores asociados a las métricas indicadas para el nodo en cuestión:
Una barra verde en el interior de cada nodo indica la proporción de la métrica principal (con respecto al máximo de dicha métrica en el nivel en el que se encuentre). Si nos encontramos en el segundo nivel de la jerarquía (o inferior), se muestran tantas barras verdes como sea necesario para mostrar el porcentaje que la métrica representa con respecto al máximo de cada nivel (actual o anterior). Estos porcentajes se muestran también al mover el cursor encima del nodo, tal y como puede apreciarse en la imagen anterior, en la que puede verse cómo el porcentaje de 25.2% ha sustituido a la cifra de ventas de Italia (1.248.372€).
La visualización solo ofrece dos características personalizables: si se muestran o no los valores en los nodos, y el número de nodos a esconder o mostrar usando los referidos iconos que apuntan a la derecha e izquierda.
Aun cuando la visualización resulta de gran utilidad en ciertos entornos, su mayor limitación tiene que ver son su aspecto: los colores no se adaptan al tema que se esté usando, no se pueden personalizar de ninguna forma (y las elecciones hechas pueden calificarse de bastante poco atractivas), y no ofrece un diseño coherente con el entorno ofrecido por Power BI. Como ejemplo, véase en la imagen anterior la ventana flotante que se muestra al mover el cursor por encima de un nodo con fondo azul y texto en blanco: ni es personalizable ni guarda coherencia alguna con el esquema gráfico de las demás ventanas de este estilo que estaremos usando en nuestros informes.
También se agradecerían herramientas adicionales, como poder configurar el árbol de forma que al expandir una rama se colapsasen (o no) las demás ramas del mismo nivel, por ejemplo. De otra forma, en ocasiones el árbol es tan grande que resulta complicado moverse por él.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'd008e6bd-5d78-419d-94fa-aa254c966d88') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>TreeViz</strong>, permite la creación de árboles jerárquicos que muestren información sobre una o más métricas. Para ello, la visualización ofrece dos únicos campos: <em>Category Data</em>, al que llevar los campos que compondrán la jerarquía a representar, y <em>Measure Data</em>, al que llevar una o varias métricas (la primera será la mostrada en los nodos, las demás serán visibles solo en la ventana flotante que se muestra al mover el cursor encima de ellos). Por ejemplo, si queremos visualizar las ventas por país y sexo del comprador, bastaría con configurar la visualización de la siguiente forma:
El resultado es el siguiente:
Un clic en alguno de los símbolos que se muestran en la parte inferior de los nodos (la doble flecha apuntando hacia abajo) despliega el nodo en cuestión para mostrar el siguiente nivel de la jerarquía:
El símbolo equivalente apuntando hacia arriba sirve para colapsar dicha rama del árbol, y los mismos símbolos apuntando a la izquierda o a la derecha esconden o muestran los nodos que representan los menores valores del nivel.
Como se muestra en la siguiente captura de pantalla, al mover el cursor encima de un nodo se muestran los valores asociados a las métricas indicadas para el nodo en cuestión:
Una barra verde en el interior de cada nodo indica la proporción de la métrica principal (con respecto al máximo de dicha métrica en el nivel en el que se encuentre). Si nos encontramos en el segundo nivel de la jerarquía (o inferior), se muestran tantas barras verdes como sea necesario para mostrar el porcentaje que la métrica representa con respecto al máximo de cada nivel (actual o anterior). Estos porcentajes se muestran también al mover el cursor encima del nodo, tal y como puede apreciarse en la imagen anterior, en la que puede verse cómo el porcentaje de 25.2% ha sustituido a la cifra de ventas de Italia (1.248.372€).
La visualización solo ofrece dos características personalizables: si se muestran o no los valores en los nodos, y el número de nodos a esconder o mostrar usando los referidos iconos que apuntan a la derecha e izquierda.
Aun cuando la visualización resulta de gran utilidad en ciertos entornos, su mayor limitación tiene que ver son su aspecto: los colores no se adaptan al tema que se esté usando, no se pueden personalizar de ninguna forma (y las elecciones hechas pueden calificarse de bastante poco atractivas), y no ofrece un diseño coherente con el entorno ofrecido por Power BI. Como ejemplo, véase en la imagen anterior la ventana flotante que se muestra al mover el cursor por encima de un nodo con fondo azul y texto en blanco: ni es personalizable ni guarda coherencia alguna con el esquema gráfico de las demás ventanas de este estilo que estaremos usando en nuestros informes.
También se agradecerían herramientas adicionales, como poder configurar el árbol de forma que al expandir una rama se colapsasen (o no) las demás ramas del mismo nivel, por ejemplo. De otra forma, en ocasiones el árbol es tan grande que resulta complicado moverse por él.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'd008e6bd-5d78-419d-94fa-aa254c966d88') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>TreeViz</strong>, permite la creación de árboles jerárquicos que muestren información sobre una o más métricas. Para ello, la visualización ofrece dos únicos campos: <em>Category Data</em>, al que llevar los campos que compondrán la jerarquía a representar, y <em>Measure Data</em>, al que llevar una o varias métricas (la primera será la mostrada en los nodos, las demás serán visibles solo en la ventana flotante que se muestra al mover el cursor encima de ellos). Por ejemplo, si queremos visualizar las ventas por país y sexo del comprador, bastaría con configurar la visualización de la siguiente forma:
El resultado es el siguiente:
Un clic en alguno de los símbolos que se muestran en la parte inferior de los nodos (la doble flecha apuntando hacia abajo) despliega el nodo en cuestión para mostrar el siguiente nivel de la jerarquía:
El símbolo equivalente apuntando hacia arriba sirve para colapsar dicha rama del árbol, y los mismos símbolos apuntando a la izquierda o a la derecha esconden o muestran los nodos que representan los menores valores del nivel.
Como se muestra en la siguiente captura de pantalla, al mover el cursor encima de un nodo se muestran los valores asociados a las métricas indicadas para el nodo en cuestión:
Una barra verde en el interior de cada nodo indica la proporción de la métrica principal (con respecto al máximo de dicha métrica en el nivel en el que se encuentre). Si nos encontramos en el segundo nivel de la jerarquía (o inferior), se muestran tantas barras verdes como sea necesario para mostrar el porcentaje que la métrica representa con respecto al máximo de cada nivel (actual o anterior). Estos porcentajes se muestran también al mover el cursor encima del nodo, tal y como puede apreciarse en la imagen anterior, en la que puede verse cómo el porcentaje de 25.2% ha sustituido a la cifra de ventas de Italia (1.248.372€).
La visualización solo ofrece dos características personalizables: si se muestran o no los valores en los nodos, y el número de nodos a esconder o mostrar usando los referidos iconos que apuntan a la derecha e izquierda.
Aun cuando la visualización resulta de gran utilidad en ciertos entornos, su mayor limitación tiene que ver son su aspecto: los colores no se adaptan al tema que se esté usando, no se pueden personalizar de ninguna forma (y las elecciones hechas pueden calificarse de bastante poco atractivas), y no ofrece un diseño coherente con el entorno ofrecido por Power BI. Como ejemplo, véase en la imagen anterior la ventana flotante que se muestra al mover el cursor por encima de un nodo con fondo azul y texto en blanco: ni es personalizable ni guarda coherencia alguna con el esquema gráfico de las demás ventanas de este estilo que estaremos usando en nuestros informes.
También se agradecerían herramientas adicionales, como poder configurar el árbol de forma que al expandir una rama se colapsasen (o no) las demás ramas del mismo nivel, por ejemplo. De otra forma, en ocasiones el árbol es tan grande que resulta complicado moverse por él.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '776d2a25-cc68-40df-8017-68258a2b148a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>TreeViz</strong>, permite la creación de árboles jerárquicos que muestren información sobre una o más métricas. Para ello, la visualización ofrece dos únicos campos: <em>Category Data</em>, al que llevar los campos que compondrán la jerarquía a representar, y <em>Measure Data</em>, al que llevar una o varias métricas (la primera será la mostrada en los nodos, las demás serán visibles solo en la ventana flotante que se muestra al mover el cursor encima de ellos). Por ejemplo, si queremos visualizar las ventas por país y sexo del comprador, bastaría con configurar la visualización de la siguiente forma:
El resultado es el siguiente:
Un clic en alguno de los símbolos que se muestran en la parte inferior de los nodos (la doble flecha apuntando hacia abajo) despliega el nodo en cuestión para mostrar el siguiente nivel de la jerarquía:
El símbolo equivalente apuntando hacia arriba sirve para colapsar dicha rama del árbol, y los mismos símbolos apuntando a la izquierda o a la derecha esconden o muestran los nodos que representan los menores valores del nivel.
Como se muestra en la siguiente captura de pantalla, al mover el cursor encima de un nodo se muestran los valores asociados a las métricas indicadas para el nodo en cuestión:
Una barra verde en el interior de cada nodo indica la proporción de la métrica principal (con respecto al máximo de dicha métrica en el nivel en el que se encuentre). Si nos encontramos en el segundo nivel de la jerarquía (o inferior), se muestran tantas barras verdes como sea necesario para mostrar el porcentaje que la métrica representa con respecto al máximo de cada nivel (actual o anterior). Estos porcentajes se muestran también al mover el cursor encima del nodo, tal y como puede apreciarse en la imagen anterior, en la que puede verse cómo el porcentaje de 25.2% ha sustituido a la cifra de ventas de Italia (1.248.372€).
La visualización solo ofrece dos características personalizables: si se muestran o no los valores en los nodos, y el número de nodos a esconder o mostrar usando los referidos iconos que apuntan a la derecha e izquierda.
Aun cuando la visualización resulta de gran utilidad en ciertos entornos, su mayor limitación tiene que ver son su aspecto: los colores no se adaptan al tema que se esté usando, no se pueden personalizar de ninguna forma (y las elecciones hechas pueden calificarse de bastante poco atractivas), y no ofrece un diseño coherente con el entorno ofrecido por Power BI. Como ejemplo, véase en la imagen anterior la ventana flotante que se muestra al mover el cursor por encima de un nodo con fondo azul y texto en blanco: ni es personalizable ni guarda coherencia alguna con el esquema gráfico de las demás ventanas de este estilo que estaremos usando en nuestros informes.
También se agradecerían herramientas adicionales, como poder configurar el árbol de forma que al expandir una rama se colapsasen (o no) las demás ramas del mismo nivel, por ejemplo. De otra forma, en ocasiones el árbol es tan grande que resulta complicado moverse por él.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '776d2a25-cc68-40df-8017-68258a2b148a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>TreeViz</strong>, permite la creación de árboles jerárquicos que muestren información sobre una o más métricas. Para ello, la visualización ofrece dos únicos campos: <em>Category Data</em>, al que llevar los campos que compondrán la jerarquía a representar, y <em>Measure Data</em>, al que llevar una o varias métricas (la primera será la mostrada en los nodos, las demás serán visibles solo en la ventana flotante que se muestra al mover el cursor encima de ellos). Por ejemplo, si queremos visualizar las ventas por país y sexo del comprador, bastaría con configurar la visualización de la siguiente forma:
El resultado es el siguiente:
Un clic en alguno de los símbolos que se muestran en la parte inferior de los nodos (la doble flecha apuntando hacia abajo) despliega el nodo en cuestión para mostrar el siguiente nivel de la jerarquía:
El símbolo equivalente apuntando hacia arriba sirve para colapsar dicha rama del árbol, y los mismos símbolos apuntando a la izquierda o a la derecha esconden o muestran los nodos que representan los menores valores del nivel.
Como se muestra en la siguiente captura de pantalla, al mover el cursor encima de un nodo se muestran los valores asociados a las métricas indicadas para el nodo en cuestión:
Una barra verde en el interior de cada nodo indica la proporción de la métrica principal (con respecto al máximo de dicha métrica en el nivel en el que se encuentre). Si nos encontramos en el segundo nivel de la jerarquía (o inferior), se muestran tantas barras verdes como sea necesario para mostrar el porcentaje que la métrica representa con respecto al máximo de cada nivel (actual o anterior). Estos porcentajes se muestran también al mover el cursor encima del nodo, tal y como puede apreciarse en la imagen anterior, en la que puede verse cómo el porcentaje de 25.2% ha sustituido a la cifra de ventas de Italia (1.248.372€).
La visualización solo ofrece dos características personalizables: si se muestran o no los valores en los nodos, y el número de nodos a esconder o mostrar usando los referidos iconos que apuntan a la derecha e izquierda.
Aun cuando la visualización resulta de gran utilidad en ciertos entornos, su mayor limitación tiene que ver son su aspecto: los colores no se adaptan al tema que se esté usando, no se pueden personalizar de ninguna forma (y las elecciones hechas pueden calificarse de bastante poco atractivas), y no ofrece un diseño coherente con el entorno ofrecido por Power BI. Como ejemplo, véase en la imagen anterior la ventana flotante que se muestra al mover el cursor por encima de un nodo con fondo azul y texto en blanco: ni es personalizable ni guarda coherencia alguna con el esquema gráfico de las demás ventanas de este estilo que estaremos usando en nuestros informes.
También se agradecerían herramientas adicionales, como poder configurar el árbol de forma que al expandir una rama se colapsasen (o no) las demás ramas del mismo nivel, por ejemplo. De otra forma, en ocasiones el árbol es tan grande que resulta complicado moverse por él.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '776d2a25-cc68-40df-8017-68258a2b148a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>TreeViz</strong>, permite la creación de árboles jerárquicos que muestren información sobre una o más métricas. Para ello, la visualización ofrece dos únicos campos: <em>Category Data</em>, al que llevar los campos que compondrán la jerarquía a representar, y <em>Measure Data</em>, al que llevar una o varias métricas (la primera será la mostrada en los nodos, las demás serán visibles solo en la ventana flotante que se muestra al mover el cursor encima de ellos). Por ejemplo, si queremos visualizar las ventas por país y sexo del comprador, bastaría con configurar la visualización de la siguiente forma:
El resultado es el siguiente:
Un clic en alguno de los símbolos que se muestran en la parte inferior de los nodos (la doble flecha apuntando hacia abajo) despliega el nodo en cuestión para mostrar el siguiente nivel de la jerarquía:
El símbolo equivalente apuntando hacia arriba sirve para colapsar dicha rama del árbol, y los mismos símbolos apuntando a la izquierda o a la derecha esconden o muestran los nodos que representan los menores valores del nivel.
Como se muestra en la siguiente captura de pantalla, al mover el cursor encima de un nodo se muestran los valores asociados a las métricas indicadas para el nodo en cuestión:
Una barra verde en el interior de cada nodo indica la proporción de la métrica principal (con respecto al máximo de dicha métrica en el nivel en el que se encuentre). Si nos encontramos en el segundo nivel de la jerarquía (o inferior), se muestran tantas barras verdes como sea necesario para mostrar el porcentaje que la métrica representa con respecto al máximo de cada nivel (actual o anterior). Estos porcentajes se muestran también al mover el cursor encima del nodo, tal y como puede apreciarse en la imagen anterior, en la que puede verse cómo el porcentaje de 25.2% ha sustituido a la cifra de ventas de Italia (1.248.372€).
La visualización solo ofrece dos características personalizables: si se muestran o no los valores en los nodos, y el número de nodos a esconder o mostrar usando los referidos iconos que apuntan a la derecha e izquierda.
Aun cuando la visualización resulta de gran utilidad en ciertos entornos, su mayor limitación tiene que ver son su aspecto: los colores no se adaptan al tema que se esté usando, no se pueden personalizar de ninguna forma (y las elecciones hechas pueden calificarse de bastante poco atractivas), y no ofrece un diseño coherente con el entorno ofrecido por Power BI. Como ejemplo, véase en la imagen anterior la ventana flotante que se muestra al mover el cursor por encima de un nodo con fondo azul y texto en blanco: ni es personalizable ni guarda coherencia alguna con el esquema gráfico de las demás ventanas de este estilo que estaremos usando en nuestros informes.
También se agradecerían herramientas adicionales, como poder configurar el árbol de forma que al expandir una rama se colapsasen (o no) las demás ramas del mismo nivel, por ejemplo. De otra forma, en ocasiones el árbol es tan grande que resulta complicado moverse por él.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '776d2a25-cc68-40df-8017-68258a2b148a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>TreeViz</strong>, permite la creación de árboles jerárquicos que muestren información sobre una o más métricas. Para ello, la visualización ofrece dos únicos campos: <em>Category Data</em>, al que llevar los campos que compondrán la jerarquía a representar, y <em>Measure Data</em>, al que llevar una o varias métricas (la primera será la mostrada en los nodos, las demás serán visibles solo en la ventana flotante que se muestra al mover el cursor encima de ellos). Por ejemplo, si queremos visualizar las ventas por país y sexo del comprador, bastaría con configurar la visualización de la siguiente forma:
El resultado es el siguiente:
Un clic en alguno de los símbolos que se muestran en la parte inferior de los nodos (la doble flecha apuntando hacia abajo) despliega el nodo en cuestión para mostrar el siguiente nivel de la jerarquía:
El símbolo equivalente apuntando hacia arriba sirve para colapsar dicha rama del árbol, y los mismos símbolos apuntando a la izquierda o a la derecha esconden o muestran los nodos que representan los menores valores del nivel.
Como se muestra en la siguiente captura de pantalla, al mover el cursor encima de un nodo se muestran los valores asociados a las métricas indicadas para el nodo en cuestión:
Una barra verde en el interior de cada nodo indica la proporción de la métrica principal (con respecto al máximo de dicha métrica en el nivel en el que se encuentre). Si nos encontramos en el segundo nivel de la jerarquía (o inferior), se muestran tantas barras verdes como sea necesario para mostrar el porcentaje que la métrica representa con respecto al máximo de cada nivel (actual o anterior). Estos porcentajes se muestran también al mover el cursor encima del nodo, tal y como puede apreciarse en la imagen anterior, en la que puede verse cómo el porcentaje de 25.2% ha sustituido a la cifra de ventas de Italia (1.248.372€).
La visualización solo ofrece dos características personalizables: si se muestran o no los valores en los nodos, y el número de nodos a esconder o mostrar usando los referidos iconos que apuntan a la derecha e izquierda.
Aun cuando la visualización resulta de gran utilidad en ciertos entornos, su mayor limitación tiene que ver son su aspecto: los colores no se adaptan al tema que se esté usando, no se pueden personalizar de ninguna forma (y las elecciones hechas pueden calificarse de bastante poco atractivas), y no ofrece un diseño coherente con el entorno ofrecido por Power BI. Como ejemplo, véase en la imagen anterior la ventana flotante que se muestra al mover el cursor por encima de un nodo con fondo azul y texto en blanco: ni es personalizable ni guarda coherencia alguna con el esquema gráfico de las demás ventanas de este estilo que estaremos usando en nuestros informes.
También se agradecerían herramientas adicionales, como poder configurar el árbol de forma que al expandir una rama se colapsasen (o no) las demás ramas del mismo nivel, por ejemplo. De otra forma, en ocasiones el árbol es tan grande que resulta complicado moverse por él.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '9a84cbb0-fad9-4764-8387-1f974a54d331') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>TreeViz</strong>, permite la creación de árboles jerárquicos que muestren información sobre una o más métricas. Para ello, la visualización ofrece dos únicos campos: <em>Category Data</em>, al que llevar los campos que compondrán la jerarquía a representar, y <em>Measure Data</em>, al que llevar una o varias métricas (la primera será la mostrada en los nodos, las demás serán visibles solo en la ventana flotante que se muestra al mover el cursor encima de ellos). Por ejemplo, si queremos visualizar las ventas por país y sexo del comprador, bastaría con configurar la visualización de la siguiente forma:
El resultado es el siguiente:
Un clic en alguno de los símbolos que se muestran en la parte inferior de los nodos (la doble flecha apuntando hacia abajo) despliega el nodo en cuestión para mostrar el siguiente nivel de la jerarquía:
El símbolo equivalente apuntando hacia arriba sirve para colapsar dicha rama del árbol, y los mismos símbolos apuntando a la izquierda o a la derecha esconden o muestran los nodos que representan los menores valores del nivel.
Como se muestra en la siguiente captura de pantalla, al mover el cursor encima de un nodo se muestran los valores asociados a las métricas indicadas para el nodo en cuestión:
Una barra verde en el interior de cada nodo indica la proporción de la métrica principal (con respecto al máximo de dicha métrica en el nivel en el que se encuentre). Si nos encontramos en el segundo nivel de la jerarquía (o inferior), se muestran tantas barras verdes como sea necesario para mostrar el porcentaje que la métrica representa con respecto al máximo de cada nivel (actual o anterior). Estos porcentajes se muestran también al mover el cursor encima del nodo, tal y como puede apreciarse en la imagen anterior, en la que puede verse cómo el porcentaje de 25.2% ha sustituido a la cifra de ventas de Italia (1.248.372€).
La visualización solo ofrece dos características personalizables: si se muestran o no los valores en los nodos, y el número de nodos a esconder o mostrar usando los referidos iconos que apuntan a la derecha e izquierda.
Aun cuando la visualización resulta de gran utilidad en ciertos entornos, su mayor limitación tiene que ver son su aspecto: los colores no se adaptan al tema que se esté usando, no se pueden personalizar de ninguna forma (y las elecciones hechas pueden calificarse de bastante poco atractivas), y no ofrece un diseño coherente con el entorno ofrecido por Power BI. Como ejemplo, véase en la imagen anterior la ventana flotante que se muestra al mover el cursor por encima de un nodo con fondo azul y texto en blanco: ni es personalizable ni guarda coherencia alguna con el esquema gráfico de las demás ventanas de este estilo que estaremos usando en nuestros informes.
También se agradecerían herramientas adicionales, como poder configurar el árbol de forma que al expandir una rama se colapsasen (o no) las demás ramas del mismo nivel, por ejemplo. De otra forma, en ocasiones el árbol es tan grande que resulta complicado moverse por él.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '9a84cbb0-fad9-4764-8387-1f974a54d331') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>TreeViz</strong>, permite la creación de árboles jerárquicos que muestren información sobre una o más métricas. Para ello, la visualización ofrece dos únicos campos: <em>Category Data</em>, al que llevar los campos que compondrán la jerarquía a representar, y <em>Measure Data</em>, al que llevar una o varias métricas (la primera será la mostrada en los nodos, las demás serán visibles solo en la ventana flotante que se muestra al mover el cursor encima de ellos). Por ejemplo, si queremos visualizar las ventas por país y sexo del comprador, bastaría con configurar la visualización de la siguiente forma:
El resultado es el siguiente:
Un clic en alguno de los símbolos que se muestran en la parte inferior de los nodos (la doble flecha apuntando hacia abajo) despliega el nodo en cuestión para mostrar el siguiente nivel de la jerarquía:
El símbolo equivalente apuntando hacia arriba sirve para colapsar dicha rama del árbol, y los mismos símbolos apuntando a la izquierda o a la derecha esconden o muestran los nodos que representan los menores valores del nivel.
Como se muestra en la siguiente captura de pantalla, al mover el cursor encima de un nodo se muestran los valores asociados a las métricas indicadas para el nodo en cuestión:
Una barra verde en el interior de cada nodo indica la proporción de la métrica principal (con respecto al máximo de dicha métrica en el nivel en el que se encuentre). Si nos encontramos en el segundo nivel de la jerarquía (o inferior), se muestran tantas barras verdes como sea necesario para mostrar el porcentaje que la métrica representa con respecto al máximo de cada nivel (actual o anterior). Estos porcentajes se muestran también al mover el cursor encima del nodo, tal y como puede apreciarse en la imagen anterior, en la que puede verse cómo el porcentaje de 25.2% ha sustituido a la cifra de ventas de Italia (1.248.372€).
La visualización solo ofrece dos características personalizables: si se muestran o no los valores en los nodos, y el número de nodos a esconder o mostrar usando los referidos iconos que apuntan a la derecha e izquierda.
Aun cuando la visualización resulta de gran utilidad en ciertos entornos, su mayor limitación tiene que ver son su aspecto: los colores no se adaptan al tema que se esté usando, no se pueden personalizar de ninguna forma (y las elecciones hechas pueden calificarse de bastante poco atractivas), y no ofrece un diseño coherente con el entorno ofrecido por Power BI. Como ejemplo, véase en la imagen anterior la ventana flotante que se muestra al mover el cursor por encima de un nodo con fondo azul y texto en blanco: ni es personalizable ni guarda coherencia alguna con el esquema gráfico de las demás ventanas de este estilo que estaremos usando en nuestros informes.
También se agradecerían herramientas adicionales, como poder configurar el árbol de forma que al expandir una rama se colapsasen (o no) las demás ramas del mismo nivel, por ejemplo. De otra forma, en ocasiones el árbol es tan grande que resulta complicado moverse por él.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '9a84cbb0-fad9-4764-8387-1f974a54d331') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>TreeViz</strong>, permite la creación de árboles jerárquicos que muestren información sobre una o más métricas. Para ello, la visualización ofrece dos únicos campos: <em>Category Data</em>, al que llevar los campos que compondrán la jerarquía a representar, y <em>Measure Data</em>, al que llevar una o varias métricas (la primera será la mostrada en los nodos, las demás serán visibles solo en la ventana flotante que se muestra al mover el cursor encima de ellos). Por ejemplo, si queremos visualizar las ventas por país y sexo del comprador, bastaría con configurar la visualización de la siguiente forma:
El resultado es el siguiente:
Un clic en alguno de los símbolos que se muestran en la parte inferior de los nodos (la doble flecha apuntando hacia abajo) despliega el nodo en cuestión para mostrar el siguiente nivel de la jerarquía:
El símbolo equivalente apuntando hacia arriba sirve para colapsar dicha rama del árbol, y los mismos símbolos apuntando a la izquierda o a la derecha esconden o muestran los nodos que representan los menores valores del nivel.
Como se muestra en la siguiente captura de pantalla, al mover el cursor encima de un nodo se muestran los valores asociados a las métricas indicadas para el nodo en cuestión:
Una barra verde en el interior de cada nodo indica la proporción de la métrica principal (con respecto al máximo de dicha métrica en el nivel en el que se encuentre). Si nos encontramos en el segundo nivel de la jerarquía (o inferior), se muestran tantas barras verdes como sea necesario para mostrar el porcentaje que la métrica representa con respecto al máximo de cada nivel (actual o anterior). Estos porcentajes se muestran también al mover el cursor encima del nodo, tal y como puede apreciarse en la imagen anterior, en la que puede verse cómo el porcentaje de 25.2% ha sustituido a la cifra de ventas de Italia (1.248.372€).
La visualización solo ofrece dos características personalizables: si se muestran o no los valores en los nodos, y el número de nodos a esconder o mostrar usando los referidos iconos que apuntan a la derecha e izquierda.
Aun cuando la visualización resulta de gran utilidad en ciertos entornos, su mayor limitación tiene que ver son su aspecto: los colores no se adaptan al tema que se esté usando, no se pueden personalizar de ninguna forma (y las elecciones hechas pueden calificarse de bastante poco atractivas), y no ofrece un diseño coherente con el entorno ofrecido por Power BI. Como ejemplo, véase en la imagen anterior la ventana flotante que se muestra al mover el cursor por encima de un nodo con fondo azul y texto en blanco: ni es personalizable ni guarda coherencia alguna con el esquema gráfico de las demás ventanas de este estilo que estaremos usando en nuestros informes.
También se agradecerían herramientas adicionales, como poder configurar el árbol de forma que al expandir una rama se colapsasen (o no) las demás ramas del mismo nivel, por ejemplo. De otra forma, en ocasiones el árbol es tan grande que resulta complicado moverse por él.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '9a84cbb0-fad9-4764-8387-1f974a54d331') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>TreeViz</strong>, permite la creación de árboles jerárquicos que muestren información sobre una o más métricas. Para ello, la visualización ofrece dos únicos campos: <em>Category Data</em>, al que llevar los campos que compondrán la jerarquía a representar, y <em>Measure Data</em>, al que llevar una o varias métricas (la primera será la mostrada en los nodos, las demás serán visibles solo en la ventana flotante que se muestra al mover el cursor encima de ellos). Por ejemplo, si queremos visualizar las ventas por país y sexo del comprador, bastaría con configurar la visualización de la siguiente forma:
El resultado es el siguiente:
Un clic en alguno de los símbolos que se muestran en la parte inferior de los nodos (la doble flecha apuntando hacia abajo) despliega el nodo en cuestión para mostrar el siguiente nivel de la jerarquía:
El símbolo equivalente apuntando hacia arriba sirve para colapsar dicha rama del árbol, y los mismos símbolos apuntando a la izquierda o a la derecha esconden o muestran los nodos que representan los menores valores del nivel.
Como se muestra en la siguiente captura de pantalla, al mover el cursor encima de un nodo se muestran los valores asociados a las métricas indicadas para el nodo en cuestión:
Una barra verde en el interior de cada nodo indica la proporción de la métrica principal (con respecto al máximo de dicha métrica en el nivel en el que se encuentre). Si nos encontramos en el segundo nivel de la jerarquía (o inferior), se muestran tantas barras verdes como sea necesario para mostrar el porcentaje que la métrica representa con respecto al máximo de cada nivel (actual o anterior). Estos porcentajes se muestran también al mover el cursor encima del nodo, tal y como puede apreciarse en la imagen anterior, en la que puede verse cómo el porcentaje de 25.2% ha sustituido a la cifra de ventas de Italia (1.248.372€).
La visualización solo ofrece dos características personalizables: si se muestran o no los valores en los nodos, y el número de nodos a esconder o mostrar usando los referidos iconos que apuntan a la derecha e izquierda.
Aun cuando la visualización resulta de gran utilidad en ciertos entornos, su mayor limitación tiene que ver son su aspecto: los colores no se adaptan al tema que se esté usando, no se pueden personalizar de ninguna forma (y las elecciones hechas pueden calificarse de bastante poco atractivas), y no ofrece un diseño coherente con el entorno ofrecido por Power BI. Como ejemplo, véase en la imagen anterior la ventana flotante que se muestra al mover el cursor por encima de un nodo con fondo azul y texto en blanco: ni es personalizable ni guarda coherencia alguna con el esquema gráfico de las demás ventanas de este estilo que estaremos usando en nuestros informes.
También se agradecerían herramientas adicionales, como poder configurar el árbol de forma que al expandir una rama se colapsasen (o no) las demás ramas del mismo nivel, por ejemplo. De otra forma, en ocasiones el árbol es tan grande que resulta complicado moverse por él.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '645b8c30-1158-40e7-9945-e0140a2c48be') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Text Filter</strong> 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 <em>Text Filter</em> el campo <em>Full Name</em> que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre:
En cuanto escribimos algún texto en el filtro y presionamos <em>Intro</em>, la tabla inferior se filtra para mostrar solo aquellos valores de <em>Full Name</em> que contienen el texto en cuestión:
La configuración de esta visualización es sumamente simple:
...apenas, el campo con el que va asociada.
A la derecha del recuadro de búsqueda se muestra in pequeño icono (representando una goma de borrar) que permite reinicializar la búsqueda.
Y no se ofrecen herramientas adicionales de configuración, es decir, no podemos controlar el tamaño del texto de la visualización, ni colores.
Práctica visualización, aunque se agradecería alguna opción adicional de personalización.', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '645b8c30-1158-40e7-9945-e0140a2c48be') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Text Filter</strong> 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 <em>Text Filter</em> el campo <em>Full Name</em> que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre:
En cuanto escribimos algún texto en el filtro y presionamos <em>Intro</em>, la tabla inferior se filtra para mostrar solo aquellos valores de <em>Full Name</em> que contienen el texto en cuestión:
La configuración de esta visualización es sumamente simple:
...apenas, el campo con el que va asociada.
A la derecha del recuadro de búsqueda se muestra in pequeño icono (representando una goma de borrar) que permite reinicializar la búsqueda.
Y no se ofrecen herramientas adicionales de configuración, es decir, no podemos controlar el tamaño del texto de la visualización, ni colores.
Práctica visualización, aunque se agradecería alguna opción adicional de personalización.', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '645b8c30-1158-40e7-9945-e0140a2c48be') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Text Filter</strong> 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 <em>Text Filter</em> el campo <em>Full Name</em> que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre:
En cuanto escribimos algún texto en el filtro y presionamos <em>Intro</em>, la tabla inferior se filtra para mostrar solo aquellos valores de <em>Full Name</em> que contienen el texto en cuestión:
La configuración de esta visualización es sumamente simple:
...apenas, el campo con el que va asociada.
A la derecha del recuadro de búsqueda se muestra in pequeño icono (representando una goma de borrar) que permite reinicializar la búsqueda.
Y no se ofrecen herramientas adicionales de configuración, es decir, no podemos controlar el tamaño del texto de la visualización, ni colores.
Práctica visualización, aunque se agradecería alguna opción adicional de personalización.', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '645b8c30-1158-40e7-9945-e0140a2c48be') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Text Filter</strong> 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 <em>Text Filter</em> el campo <em>Full Name</em> que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre:
En cuanto escribimos algún texto en el filtro y presionamos <em>Intro</em>, la tabla inferior se filtra para mostrar solo aquellos valores de <em>Full Name</em> que contienen el texto en cuestión:
La configuración de esta visualización es sumamente simple:
...apenas, el campo con el que va asociada.
A la derecha del recuadro de búsqueda se muestra in pequeño icono (representando una goma de borrar) que permite reinicializar la búsqueda.
Y no se ofrecen herramientas adicionales de configuración, es decir, no podemos controlar el tamaño del texto de la visualización, ni colores.
Práctica visualización, aunque se agradecería alguna opción adicional de personalización.', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '33a1cadb-19ae-43f7-b8e9-b440ed9bdb4a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Text Filter</strong> 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 <em>Text Filter</em> el campo <em>Full Name</em> que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre:
En cuanto escribimos algún texto en el filtro y presionamos <em>Intro</em>, la tabla inferior se filtra para mostrar solo aquellos valores de <em>Full Name</em> que contienen el texto en cuestión:
La configuración de esta visualización es sumamente simple:
...apenas, el campo con el que va asociada.
A la derecha del recuadro de búsqueda se muestra in pequeño icono (representando una goma de borrar) que permite reinicializar la búsqueda.
Y no se ofrecen herramientas adicionales de configuración, es decir, no podemos controlar el tamaño del texto de la visualización, ni colores.
Práctica visualización, aunque se agradecería alguna opción adicional de personalización.', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '33a1cadb-19ae-43f7-b8e9-b440ed9bdb4a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Text Filter</strong> 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 <em>Text Filter</em> el campo <em>Full Name</em> que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre:
En cuanto escribimos algún texto en el filtro y presionamos <em>Intro</em>, la tabla inferior se filtra para mostrar solo aquellos valores de <em>Full Name</em> que contienen el texto en cuestión:
La configuración de esta visualización es sumamente simple:
...apenas, el campo con el que va asociada.
A la derecha del recuadro de búsqueda se muestra in pequeño icono (representando una goma de borrar) que permite reinicializar la búsqueda.
Y no se ofrecen herramientas adicionales de configuración, es decir, no podemos controlar el tamaño del texto de la visualización, ni colores.
Práctica visualización, aunque se agradecería alguna opción adicional de personalización.', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '33a1cadb-19ae-43f7-b8e9-b440ed9bdb4a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Text Filter</strong> 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 <em>Text Filter</em> el campo <em>Full Name</em> que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre:
En cuanto escribimos algún texto en el filtro y presionamos <em>Intro</em>, la tabla inferior se filtra para mostrar solo aquellos valores de <em>Full Name</em> que contienen el texto en cuestión:
La configuración de esta visualización es sumamente simple:
...apenas, el campo con el que va asociada.
A la derecha del recuadro de búsqueda se muestra in pequeño icono (representando una goma de borrar) que permite reinicializar la búsqueda.
Y no se ofrecen herramientas adicionales de configuración, es decir, no podemos controlar el tamaño del texto de la visualización, ni colores.
Práctica visualización, aunque se agradecería alguna opción adicional de personalización.', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', '33a1cadb-19ae-43f7-b8e9-b440ed9bdb4a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Text Filter</strong> 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 <em>Text Filter</em> el campo <em>Full Name</em> que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre:
En cuanto escribimos algún texto en el filtro y presionamos <em>Intro</em>, la tabla inferior se filtra para mostrar solo aquellos valores de <em>Full Name</em> que contienen el texto en cuestión:
La configuración de esta visualización es sumamente simple:
...apenas, el campo con el que va asociada.
A la derecha del recuadro de búsqueda se muestra in pequeño icono (representando una goma de borrar) que permite reinicializar la búsqueda.
Y no se ofrecen herramientas adicionales de configuración, es decir, no podemos controlar el tamaño del texto de la visualización, ni colores.
Práctica visualización, aunque se agradecería alguna opción adicional de personalización.', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'd6c5e3db-3d74-4edc-a537-bdca340993ca') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Text Filter</strong> 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 <em>Text Filter</em> el campo <em>Full Name</em> que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre:
En cuanto escribimos algún texto en el filtro y presionamos <em>Intro</em>, la tabla inferior se filtra para mostrar solo aquellos valores de <em>Full Name</em> que contienen el texto en cuestión:
La configuración de esta visualización es sumamente simple:
...apenas, el campo con el que va asociada.
A la derecha del recuadro de búsqueda se muestra in pequeño icono (representando una goma de borrar) que permite reinicializar la búsqueda.
Y no se ofrecen herramientas adicionales de configuración, es decir, no podemos controlar el tamaño del texto de la visualización, ni colores.
Práctica visualización, aunque se agradecería alguna opción adicional de personalización.', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'd6c5e3db-3d74-4edc-a537-bdca340993ca') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Text Filter</strong> 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 <em>Text Filter</em> el campo <em>Full Name</em> que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre:
En cuanto escribimos algún texto en el filtro y presionamos <em>Intro</em>, la tabla inferior se filtra para mostrar solo aquellos valores de <em>Full Name</em> que contienen el texto en cuestión:
La configuración de esta visualización es sumamente simple:
...apenas, el campo con el que va asociada.
A la derecha del recuadro de búsqueda se muestra in pequeño icono (representando una goma de borrar) que permite reinicializar la búsqueda.
Y no se ofrecen herramientas adicionales de configuración, es decir, no podemos controlar el tamaño del texto de la visualización, ni colores.
Práctica visualización, aunque se agradecería alguna opción adicional de personalización.', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'd6c5e3db-3d74-4edc-a537-bdca340993ca') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Text Filter</strong> 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 <em>Text Filter</em> el campo <em>Full Name</em> que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre:
En cuanto escribimos algún texto en el filtro y presionamos <em>Intro</em>, la tabla inferior se filtra para mostrar solo aquellos valores de <em>Full Name</em> que contienen el texto en cuestión:
La configuración de esta visualización es sumamente simple:
...apenas, el campo con el que va asociada.
A la derecha del recuadro de búsqueda se muestra in pequeño icono (representando una goma de borrar) que permite reinicializar la búsqueda.
Y no se ofrecen herramientas adicionales de configuración, es decir, no podemos controlar el tamaño del texto de la visualización, ni colores.
Práctica visualización, aunque se agradecería alguna opción adicional de personalización.', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
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', 'd6c5e3db-3d74-4edc-a537-bdca340993ca') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Text Filter</strong> 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 <em>Text Filter</em> el campo <em>Full Name</em> que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre:
En cuanto escribimos algún texto en el filtro y presionamos <em>Intro</em>, la tabla inferior se filtra para mostrar solo aquellos valores de <em>Full Name</em> que contienen el texto en cuestión:
La configuración de esta visualización es sumamente simple:
...apenas, el campo con el que va asociada.
A la derecha del recuadro de búsqueda se muestra in pequeño icono (representando una goma de borrar) que permite reinicializar la búsqueda.
Y no se ofrecen herramientas adicionales de configuración, es decir, no podemos controlar el tamaño del texto de la visualización, ni colores.
Práctica visualización, aunque se agradecería alguna opción adicional de personalización.', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Return type of Drupal\google_analytics\Component\Render\GoogleAnalyticsJavaScriptSnippet::jsonSerialize() should either be compatible with JsonSerializable::jsonSerialize(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in include() (line 10 of modules/contrib/google_analytics/src/Component/Render/GoogleAnalyticsJavaScriptSnippet.php).
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)
- Deprecated function: Use of "static" in callables is deprecated in Drupal\user\Entity\Role::postLoad() (line 172 of core/modules/user/src/Entity/Role.php).
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)