- 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', 'insert-max_800_px-8e9cde13-8464-4299-a64c-c3225309bad5') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-8e9cde13-8464-4299-a64c-c3225309bad5') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-8e9cde13-8464-4299-a64c-c3225309bad5') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-8e9cde13-8464-4299-a64c-c3225309bad5') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-98e13bd3-36e9-423b-ae56-1920663e06dc') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-98e13bd3-36e9-423b-ae56-1920663e06dc') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-98e13bd3-36e9-423b-ae56-1920663e06dc') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-98e13bd3-36e9-423b-ae56-1920663e06dc') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-5b8f6b22-a8cc-49a5-ae86-ceab613785c7') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-5b8f6b22-a8cc-49a5-ae86-ceab613785c7') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-5b8f6b22-a8cc-49a5-ae86-ceab613785c7') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-5b8f6b22-a8cc-49a5-ae86-ceab613785c7') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-0519b81f-d5cb-48a5-88ce-bbf9b098414f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-0519b81f-d5cb-48a5-88ce-bbf9b098414f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-0519b81f-d5cb-48a5-88ce-bbf9b098414f') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-0519b81f-d5cb-48a5-88ce-bbf9b098414f') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-53f4b4ac-cdf1-4a73-8bff-b5852f4a5b1e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-53f4b4ac-cdf1-4a73-8bff-b5852f4a5b1e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-53f4b4ac-cdf1-4a73-8bff-b5852f4a5b1e') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-53f4b4ac-cdf1-4a73-8bff-b5852f4a5b1e') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-7482230d-eb69-48cd-86f9-2d2aefebdbdf') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-7482230d-eb69-48cd-86f9-2d2aefebdbdf') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-7482230d-eb69-48cd-86f9-2d2aefebdbdf') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-7482230d-eb69-48cd-86f9-2d2aefebdbdf') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-b89af0db-000a-4dfe-a282-a781756264c0') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-b89af0db-000a-4dfe-a282-a781756264c0') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-b89af0db-000a-4dfe-a282-a781756264c0') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-b89af0db-000a-4dfe-a282-a781756264c0') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-b7e6fa92-9870-442c-8869-b6c2b1e7f6cb') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-b7e6fa92-9870-442c-8869-b6c2b1e7f6cb') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-b7e6fa92-9870-442c-8869-b6c2b1e7f6cb') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-b7e6fa92-9870-442c-8869-b6c2b1e7f6cb') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-59bd37f7-4e2c-479b-8a91-8167899daaff') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-59bd37f7-4e2c-479b-8a91-8167899daaff') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-59bd37f7-4e2c-479b-8a91-8167899daaff') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-59bd37f7-4e2c-479b-8a91-8167899daaff') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-a92fff9e-4352-487f-ae92-75a1593230da') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-a92fff9e-4352-487f-ae92-75a1593230da') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-a92fff9e-4352-487f-ae92-75a1593230da') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-a92fff9e-4352-487f-ae92-75a1593230da') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La idea detrás de <strong>Heat Streams</strong> no es mala (aunque tampoco especialmente original): crear un mapa de calor asociado a los valores que para un campo adopta una métrica, forzando que el segundo eje de la gráfica sea (supuestamente) temporal. Sin embargo, tal y como vamos a ver, se trata de un desarrollo muy poco pulido, con algunas limitaciones prácticas y no tan útil como podría esperarse. La visualización nos ofrece el siguiente panel de campos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_01.jpg"></a>
<ul><li>Campo <em>Category</em>: contendrá el campo cuyos valores determinarán las etiquetas del eje vertical.</li>
<li>Campo <em>Score</em>: contendrá el campo cuantitativo o medida que determinará el color de cada celda.</li>
<li>Campo <em>Time</em>: recibirá el campo temporal que determinará el contenido del eje horizontal.</li>
</ul>Para realizar una primera prueba, supongamos que queremos analizar el cambio en el tiempo de la valoración que nuestros clientes hacen de nosotros, y que queremos desglosar los clientes según su estado civil. Para ello, llevemos el campo <em>Marital Status</em> a <em>Category</em>, el campo <em>Rating</em> a <em>Score</em> (estos dos campos los tenemos en la misma tabla, <em>Customers</em>) y llevemos el campo <em>Date</em> (campo de tipo <em>datetime</em>) del calendario al campo <em>Time</em> de la visualizacion. Y configuremos el campo <em>Rating</em> para que la función de agregación a aplicar sea el promedio. El resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_02_0.jpg"></a>
Se muestra cada celda de un color que refleja la métrica en cuestión, aunque no se visualiza una leyenda que nos ayude a interpretar los colores.
Apreciamos también que el espacio dado a las etiquetas del eje vertical no se adapta adecuadamente a éstas (hay que especificar manualmente el porcentaje del ancho de la visualización que se va a reservar a este efecto en <em>Formato > View Settings > Text %</em>).
Pero la gran pregunta que uno se hace es ¿según qué criterio estamos dividiendo el eje horizontal? ¿días, tal vez? Porque hemos llevado al campo <em>Time</em> una jerarquía de fechas. Y por ningún lado se aprecian herramientas que nos permitan navegar por ésta, ni etiquetas que indiquen qué nivel se está considerando. Lo único que vemos en el eje horizontal es un contador que, comenzando por 1, llega hasta 32 (número que tampoco se visualiza correctamente). Y el hecho es que en <em>Formato > View Settings > Num Axis Ticks</em>, por defecto se especifica que en este eje deberán mostrarse 30 marcas (y no 32).
Ante la duda, eliminemos el campo <em>Date</em> y llevemos en su lugar -simplemente- el campo <em>Year</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_03_0.jpg"></a>
Vemos que se muestra una columna por año (aunque esto no responde a la pregunta que nos hicimos antes ¿estábamos viendo días?), y que en el eje horizontal se muestran muchos ticks, solapando unos con otros (26, si no estoy contando mal, lo que no coincide ni con el número de columnas ni con la cifra especificada en <em>Formato > View Settings > Num Axis Ticks</em>). Especifiquemos en este último campo el valor 5 (pues tenemos 5 años):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_04_0.jpg"></a>
Ahora estamos viendo una marca por año más otra al final (es decir, no vemos 5, sino 6). Esto significa que si vamos a mostrar, digamos, semanas, y hay muchas, deberemos contarlas previamente (de alguna forma) si deseamos que se muestra un tick por columna (incluyendo o no un tick para el final de la última). Realmente incómodo.
La conclusión a la que se llega es que lo que se denomina <em>Time</em> en la visualización hace realmente referencia a cualquier campo numérico (sea ordinal o nominal). Es decir, si tenemos un número que haga referencia a los países en los que operamos, podríamos llevar dicho número al mencionado campo <em>Time</em> para generar la visualización. Es decir, la visualización no acepta campos de fecha y hora -a pesar del nombre-.
En <em>Formato > Data Settings > Date Buckets</em> podemos escoger lo que aparenta ser la granularidad con la que se van a considerar los datos, lo que no parece muy coherente con el hecho de poder llevar al campo <em>Time</em> un campo que define el período temporal a mostrar.
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_05.jpg"></a>
Es decir, si en esta opción de <em>Date Buckets</em> selecciono la opción "<em>Yearly</em>" pero al campo <em>Time</em> llevo mi campo <em>Date</em> ¿quiere eso decir que para todos los días de un cierto año se va a mostrar el mismo valor (y color)? Probémoslo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_06_0.jpg"></a>
Pues no. Aunque seguimos sin sabe exactamente qué estamos mostrando en la visualización (eso sí, ahora solo se muestran 5 ticks en el eje horizontal) el hecho es que los valores para cada columna son distintos, lo que nos deja con la duda de la utilidad de esos "buckets". Y no hay documentación accesible en la página de la visualización, por supuesto.
Junto a esta opción de "<em>Date Buckets</em>" hay otro campo ("<em>Value Buckets</em>") que hace referencia al ancho de las columnas. Por defecto toma el valor 1, pero si lo disminuimos a 0.8, por ejemplo, la visualización mostraría el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_08.jpg"></a>
Los campos "<em>Min Score</em>" y "<em>Max Score</em>" van a imponer los valores mínimo y máximo a considerar para el cálculo de los colores a aplicar en la visualización. Sin embargo, las pruebas realizadas no parecen encajar con los datos disponibles. Estos son los valores medios del rating por estado civil:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_09.jpg"></a>
Podríamos pensar que el "valor mínimo" por defecto considerado por la visualización para mostrar los colores son el 0 (pues es el menor rating posible) o el 2.68 (menor valor presente en la tabla anterior). Pero si incluimos alguno de estos dos valores en el campo "<em>Min Score</em>" mencionado, la visualización no muestra los mismos colores que en la última imagen mostrada de ésta. Por ejemplo, si añadimos el valor 2.68 el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_10.jpg"></a>
En <em>Formato > View Settings > Theme</em> podemos especificar el tema que determinará los colores a aplicar:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/heat_streams_07.jpg"></a>
Comprobamos que hay una buena selección, aunque no es configurable más allá de las opciones ofrecidas.
En resumen, visualización poco intuitiva, que agradecería una revisión de los errores de visualización mencionados y un mayor control sobre qué estamos visualizando y cómo poder movernos por nuestra estructura temporal.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-e9d68aa6-4c94-4f30-bd7b-815db373566a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-e9d68aa6-4c94-4f30-bd7b-815db373566a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-e9d68aa6-4c94-4f30-bd7b-815db373566a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-e9d68aa6-4c94-4f30-bd7b-815db373566a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-c3a7ad3b-e554-4938-aca0-a4a8086b9926') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-c3a7ad3b-e554-4938-aca0-a4a8086b9926') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-c3a7ad3b-e554-4938-aca0-a4a8086b9926') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-c3a7ad3b-e554-4938-aca0-a4a8086b9926') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-9c29b10b-62b7-44d3-8bbd-e15f6b86ddf0') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-9c29b10b-62b7-44d3-8bbd-e15f6b86ddf0') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-9c29b10b-62b7-44d3-8bbd-e15f6b86ddf0') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-9c29b10b-62b7-44d3-8bbd-e15f6b86ddf0') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-92aa1c9d-42b1-4cd8-a133-abf7aa53f5af') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-92aa1c9d-42b1-4cd8-a133-abf7aa53f5af') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-92aa1c9d-42b1-4cd8-a133-abf7aa53f5af') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-92aa1c9d-42b1-4cd8-a133-abf7aa53f5af') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-95d532fa-68f6-40fc-95a8-6a14f6a43053') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-95d532fa-68f6-40fc-95a8-6a14f6a43053') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-95d532fa-68f6-40fc-95a8-6a14f6a43053') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-95d532fa-68f6-40fc-95a8-6a14f6a43053') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-bbb2359f-ff5e-4392-bc0b-314ff83cb9ba') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-bbb2359f-ff5e-4392-bc0b-314ff83cb9ba') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-bbb2359f-ff5e-4392-bc0b-314ff83cb9ba') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-bbb2359f-ff5e-4392-bc0b-314ff83cb9ba') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-0cda719f-4eb4-46e8-b033-775e171fc577') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-0cda719f-4eb4-46e8-b033-775e171fc577') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-0cda719f-4eb4-46e8-b033-775e171fc577') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-0cda719f-4eb4-46e8-b033-775e171fc577') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Python visual</strong> (<strong>Objeto visual de Python</strong>) es muy parecida al <a href="/powerbi/visual/r-script-visual-objeto-visual-de-script-de-r">Objeto visual de script de R</a>: Llevaremos a ésta campos de nuestro modelo de datos e introduciremos código escrito en Python, Power BI enviará esta información a nuestra instalación local de Python y ésta devolverá una imagen que se mostrará en la visualización. El panel de campos de la visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar los campos (no se admiten medidas) de nuestro modelo de datos que queremos que sean considerados en el script Python. Por ejemplo, arrastremos desde nuestra tabla <em>Products</em> el campo <em>Category</em> (categoría de cada producto), y desde la tabla <em>Sales</em> el campo <em>Amount</em> (importe de cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02_0.jpg"></a>
En este momento la visualización muestra únicamente el título que se asigna de forma automática, pero vemos en la interfaz de Power BI que se ha abierto una ventana acoplada a su parte inferior, el llamado <em>Editor de scripts de Python</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_03.jpg"></a>
Según nos informa el texto incluido en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset = pandas.DataFrame(Amount, Units, Freight, Margin, Satisfaction)
# dataset = dataset.drop_duplicates()
# Pegue o escriba aquí el código de script:
...los campos que hayamos arrastrado hasta la visualización se van a empaquetar en un dataframe pandas que recibe el nombre de <em>dataset</em>, de forma que nuestro código deberá hacer referencia a esta variable. Escribamos debajo de la última línea del texto comentado el siguiente script:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set()
sns.violinplot(dataset.Category, dataset.Amount)
plt.show()
En este código estamos importando las librerías seaborn y matplotlib.pyplot, estableciendo el estilo gráfico de seaborn por defecto (<code>sns.set()</code>) y creando una gráfica de violín a partir de los datos contenidos en el dataframe <em>dataset</em>.
Un clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi instalación es simplemente el bloc de notas de Windows), lo que nos permitirá editar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/python_visual_04.jpg"></a>
Si optamos por escribir el código en el IDE externo -sea el que sea- deberemos terminar copiando a mano el código en el editor ofrecido en Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a nuestra instalación local de Python, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_08.jpg"></a>
Puede apreciarse en la imagen anterior cómo -en este caso- las etiquetas asignadas a los ejes ("<em>Category</em>" y "<em>Amount</em>") se muestran cortadas.
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la gráfica de violín para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_09.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
Es de destacar que esta visualización no es compatible con todas las versiones de Python (al menos no siempre con la última). A la fecha de redacción de este texto, septiembre de 2019, la visualización devuelve un error si se está trabajando con la versión 3.7 de Python. La solución consiste en instalar una versión anterior (por ejemplo la 3.6) y configurar Power BI para que se ejecute dicho intérprete (en <em>Archivo > Opciones y Configuración > Opciones > Creación de scripts de Python</em>). La <a href="/conda/command/creacion-de-un-entorno-con-una-version-de-python-especifica">instalación de una versión anterior</a> es sumamente sencilla si trabajamos con Anaconda.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-21e9638e-6e58-4a71-b06b-bdb016fde548') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-21e9638e-6e58-4a71-b06b-bdb016fde548') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-21e9638e-6e58-4a71-b06b-bdb016fde548') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-21e9638e-6e58-4a71-b06b-bdb016fde548') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-a583b367-d159-4087-a3b9-eb276aee915a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-a583b367-d159-4087-a3b9-eb276aee915a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-a583b367-d159-4087-a3b9-eb276aee915a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-a583b367-d159-4087-a3b9-eb276aee915a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-bd8a0ad7-cdc0-4f56-aa8c-6a2457fe2371') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-bd8a0ad7-cdc0-4f56-aa8c-6a2457fe2371') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-bd8a0ad7-cdc0-4f56-aa8c-6a2457fe2371') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-bd8a0ad7-cdc0-4f56-aa8c-6a2457fe2371') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-92aa1c9d-42b1-4cd8-a133-abf7aa53f5af') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-92aa1c9d-42b1-4cd8-a133-abf7aa53f5af') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-92aa1c9d-42b1-4cd8-a133-abf7aa53f5af') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-92aa1c9d-42b1-4cd8-a133-abf7aa53f5af') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-eee7230a-e906-49cd-932a-8f8c9c404ef9') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-eee7230a-e906-49cd-932a-8f8c9c404ef9') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-eee7230a-e906-49cd-932a-8f8c9c404ef9') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-eee7230a-e906-49cd-932a-8f8c9c404ef9') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-16b6b326-69ef-4aa9-9070-1cb72f1f6955') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-16b6b326-69ef-4aa9-9070-1cb72f1f6955') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-16b6b326-69ef-4aa9-9070-1cb72f1f6955') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-16b6b326-69ef-4aa9-9070-1cb72f1f6955') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-8e4ac015-d61b-4f57-9f14-898d830abb1b') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-8e4ac015-d61b-4f57-9f14-898d830abb1b') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-8e4ac015-d61b-4f57-9f14-898d830abb1b') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-8e4ac015-d61b-4f57-9f14-898d830abb1b') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>R script visual</strong> (<strong>Objeto visual de script de R</strong>) nos permite pasar a nuestra instalación de R cierto código (escrito en R, por supuesto) y datos de nuestro modelo de datos. Nuestra instalación de R va a ejecutar el código sobre dichos datos, va a generar una imagen y la va a devolver a Power BI, mostrándose como visualización.
El panel de campos de esta visualización es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_01.jpg"></a>
Solo dispone de un campo al que llevar los campos de nuestro modelo de datos que queramos que sean tratados por R. No se admiten medidas (lo que es lógico, pues no sería posible contextualizarlas ni contar con aquellos campos a partir de los que se calculan). Por ejemplo, arrastremos desde nuestra tabla <em>Sales</em> los campos <em>Amount</em> (importe de venta), <em>Units</em> (unidades vendidas), <em>Freight</em> (coste del flete), <em>Margin</em> (margen de cada venta) y <em>Satisfaction</em> (satisfacción del comprador):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_02.jpg"></a>
La visualización se muestra todavía vacía, apenas se ve el título automático que recibe. Pero comprobamos que en la interfaz de Power BI se ha abierto una ventana acoplada a su parte inferior, ventana que recibe el nombre de <strong>Editor de script R</strong>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_03.jpg"></a>
Tal y como nos explica el texto mostrado en el editor:
# El código siguiente, que crea un dataframe y quita las filas duplicadas, siempre se ejecuta y actúa como un preámbulo del script:
# dataset <- data.frame(Amount, Units, Freight, Margin, Satisfaction)
# dataset <- unique(dataset)
# Pegue o escriba aquí el código de script:
...los datos que añadamos a la visualización se van a empaquetar en un dataframe que va a recibir el nombre de <em>dataset</em>, por lo que nuestro código deberá hacer referencia a esta variable. Escribamos, por ejemplo, el siguiente código (debajo del texto "<em># Pegue o escriba aquí el código de script:</em>"):
library(corrplot)
M <- cor(dataset)
corrplot(M, method = "circle", type="upper", tl.cex=0.6, tl.srt=45, tl.col="red")
Este código simplemente carga la librería <em>corrplot</em> y genera una matriz de correlación de las variables contenidas en el dataframe <em>dataset</em>.
Si hacemos clic en la flecha que apunta en diagonal hacia arriba en la cabecera del editor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_04.jpg"></a>
...se abrirá el código en el IDE externo que hayamos definido en las opciones de Power BI (en mi caso es RStudio), lo que nos permitirá editar y probar el código más fácilmente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_05.jpg"></a>
En todo caso, una vez terminada la edición, deberemos copiar a mano el código desde el IDE externo hasta el editor de Power BI. A continuación, -en Power BI- ya podemos ejecutar el script haciendo clic en el botón situado más a la izquierda de los cuatro que se muestran en la cabecera del editor. Esto provocará que, como se ha comentado, Power BI envíe los datos y el código a R, y espere una imagen como respuesta, imagen que mostrará en la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_06.jpg"></a>
Esta visualización no es interactiva en el sentido de que no podemos hacer clic en ella y esperar que se filtren el resto de visualizaciones, pero sí se va a adaptar de forma dinámica a cambios en el contexto. Así, si por ejemplo añadimos una segmentación y seleccionamos alguna opción, la visualización se va a actualizar para mostrar -en este caso- la matriz de correlación para los datos que se hayan seleccionado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/r_script_visual_07.jpg"></a>
Esta visualización no ofrece opciones adicionales para su personalización (más allá de las opciones comunes a todas las visualizaciones: dar formato al título, fondo, etc.).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- 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-c2ca7382-6221-49c5-8141-5517c167d83c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-c2ca7382-6221-49c5-8141-5517c167d83c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-c2ca7382-6221-49c5-8141-5517c167d83c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-c2ca7382-6221-49c5-8141-5517c167d83c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-2d7f98b3-ad2b-42b2-a5e3-4d71a7343ab5') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-2d7f98b3-ad2b-42b2-a5e3-4d71a7343ab5') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-2d7f98b3-ad2b-42b2-a5e3-4d71a7343ab5') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-2d7f98b3-ad2b-42b2-a5e3-4d71a7343ab5') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-7297ea4a-2b64-45f4-a1fc-facb2b79b4ce') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-7297ea4a-2b64-45f4-a1fc-facb2b79b4ce') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-7297ea4a-2b64-45f4-a1fc-facb2b79b4ce') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-7297ea4a-2b64-45f4-a1fc-facb2b79b4ce') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-4ea1a3bb-c227-445b-a539-0c5aff1bca78') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-4ea1a3bb-c227-445b-a539-0c5aff1bca78') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-4ea1a3bb-c227-445b-a539-0c5aff1bca78') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-4ea1a3bb-c227-445b-a539-0c5aff1bca78') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-1e42288e-2639-4ff0-909b-60d265a46c17') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-1e42288e-2639-4ff0-909b-60d265a46c17') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-1e42288e-2639-4ff0-909b-60d265a46c17') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-1e42288e-2639-4ff0-909b-60d265a46c17') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-4b721541-a559-42df-b6bd-21ecce234426') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-4b721541-a559-42df-b6bd-21ecce234426') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-4b721541-a559-42df-b6bd-21ecce234426') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-4b721541-a559-42df-b6bd-21ecce234426') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-5635f3d1-5254-4eb0-b7d8-dec86139b721') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-5635f3d1-5254-4eb0-b7d8-dec86139b721') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-5635f3d1-5254-4eb0-b7d8-dec86139b721') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-5635f3d1-5254-4eb0-b7d8-dec86139b721') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-2f81d0f6-cbfb-4622-ac1e-86fd07bb1fb2') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-2f81d0f6-cbfb-4622-ac1e-86fd07bb1fb2') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-2f81d0f6-cbfb-4622-ac1e-86fd07bb1fb2') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-2f81d0f6-cbfb-4622-ac1e-86fd07bb1fb2') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-ddde9cc5-f69c-421b-a873-8d5567f6e29e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-ddde9cc5-f69c-421b-a873-8d5567f6e29e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-ddde9cc5-f69c-421b-a873-8d5567f6e29e') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-ddde9cc5-f69c-421b-a873-8d5567f6e29e') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-36c41557-376f-43b3-a718-a64610611d64') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-36c41557-376f-43b3-a718-a64610611d64') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-36c41557-376f-43b3-a718-a64610611d64') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-36c41557-376f-43b3-a718-a64610611d64') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>matriz</strong> o <strong>matrix</strong> nos permite representar un conjunto de datos (por ejemplo, “Ventas”) segmentado según dos criterios que serán representados en una tabla con encabezados de fila y de columna (por ejemplo, “País” y “Año”). Esta visualización es semejante a la que resultaría de crear una tabla dinámica en Excel.
El panel de campos de la matriz es el que cabría esperar en este caso, con campos para filas, columnas y valores:
<a href="/sites/default/files/2019-09/matrix_01.jpg"></a>
<ul><li>Campo "<em>Filas</em>": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Columnas": recibirá el criterio de segmentación que se mostrará para las filas. Admite más de uno.</li>
<li>Campo "Valores": recibirá el valor base a mostrar. Permite añadir más de uno.</li>
</ul>En el caso de que se incluya más de un campo en filas o columnas, la tabla mostrará los subtotales correspondientes para cada uno.
Tal y como se ha sugerido, llevemos la medida <em>Sales</em> a <em>Valores</em>, el campo <em>Country</em> al campo <em>Filas</em> de la visualización y el campo <em>Año</em> (del calendario) al campo <em>Columnas</em>:
<a href="/sites/default/files/2019-09/matrix_02.jpg"></a>
Si, por ejemplo, llevamos un segundo campo a <em>Filas</em> (el campo <em>Region</em>, conteniendo la región del país en la que se realiza cada venta):
<a href="/sites/default/files/2019-09/matrix_03.jpg"></a>
...la matriz muestra un pequeño signo + a la izquierda de cada encabezado de fila, signo que nos permite desglosar el país por regiones:
<a href="/sites/default/files/2019-09/matrix_04.jpg"></a>
En este caso, también podemos movernos por la jerarquía creada haciendo uso de los típicos iconos que se muestran (si hay espacio) en la parte superior derecha de la visualización.
Los signos + y - pueden activarse o desactivarse en <em>Formato > Encabezados de fila > +/- iconos</em>.
Tanto los encabezados (de filas y columnas) como los valores pueden ser personalizados con gran detalle. Por ejemplo, podemos desactivar el diseño escalonado de filas que se ve en la anterior imagen (<em>Formato > Encabezados de fila > Diseño escalonado</em>):
<a href="/sites/default/files/2019-09/matrix_05.jpg"></a>
Ahora, las primeras dos columnas (correspondientes al país y a la región) no se solapan, y la primera región de cada país ocupa la misma fila que el país al que pertenece.
Es posible aplicar estilos predeterminados a la matriz (<em>Formato > Estilo</em>). El estilo por defecto (al que corresponden las anteriores imágenes) es el llamado <em>Valor predeterminado</em>, pero hay otros:
<ul><li>Encabezado en negrita:</li>
</ul><a href="/sites/default/files/2019-09/matrix_06.jpg"></a>
<ul><li>Filas alternas:</li>
</ul><a href="/sites/default/files/2019-09/matrix_07.jpg"></a>
<ul><li>Comprimido:</li>
</ul><a href="/sites/default/files/2019-09/matrix_08.jpg"></a>
...y otros varios.
Por supuesto, a partir de un estilo es posible especificar con detalle los colores y formato a aplicar a encabezados, valores, subtotales y total general:
<a href="/sites/default/files/2019-09/matrix_09.jpg"></a>
Es posible aplicar a las celdas con los valores un formato condicional: color de fondo, color de fuente, barras de datos e iconos (véanse los comentarios hechos al respecto para la <a href="/powerbi/visual/table-tabla">visualización Tabla</a>):
<a href="/sites/default/files/2019-09/matrix_10.jpg"></a>
Se trata de una visualización muy personalizable y versátil, y muy útil cuando necesitamos comunicar un conjunto relativamente amplio de valores con mucha precisió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', 'insert-max_800_px-03f741ca-edc7-4d25-9f23-ef5d11465a60') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-03f741ca-edc7-4d25-9f23-ef5d11465a60') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-03f741ca-edc7-4d25-9f23-ef5d11465a60') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-03f741ca-edc7-4d25-9f23-ef5d11465a60') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-81fc9d93-fa7a-428b-b03b-be28a16949ad') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-81fc9d93-fa7a-428b-b03b-be28a16949ad') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-81fc9d93-fa7a-428b-b03b-be28a16949ad') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-81fc9d93-fa7a-428b-b03b-be28a16949ad') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-d6a77e89-8ae0-4fae-a269-4195d463206e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-d6a77e89-8ae0-4fae-a269-4195d463206e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-d6a77e89-8ae0-4fae-a269-4195d463206e') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-d6a77e89-8ae0-4fae-a269-4195d463206e') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-ae1ff6a9-9468-4fcc-80bd-5e2dfc67b301') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-ae1ff6a9-9468-4fcc-80bd-5e2dfc67b301') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-ae1ff6a9-9468-4fcc-80bd-5e2dfc67b301') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-ae1ff6a9-9468-4fcc-80bd-5e2dfc67b301') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-257accdd-a1a8-413a-9fea-c6fd645e3271') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-257accdd-a1a8-413a-9fea-c6fd645e3271') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-257accdd-a1a8-413a-9fea-c6fd645e3271') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-257accdd-a1a8-413a-9fea-c6fd645e3271') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-b1aa361f-663a-4d5f-8ad9-a48d4529ae7c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-b1aa361f-663a-4d5f-8ad9-a48d4529ae7c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-b1aa361f-663a-4d5f-8ad9-a48d4529ae7c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-b1aa361f-663a-4d5f-8ad9-a48d4529ae7c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-ce77ae7b-2434-4dfc-b80a-0bf1075fd44f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-ce77ae7b-2434-4dfc-b80a-0bf1075fd44f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-ce77ae7b-2434-4dfc-b80a-0bf1075fd44f') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-ce77ae7b-2434-4dfc-b80a-0bf1075fd44f') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-d44acff8-b382-4159-943e-6ce92bc9a299') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-d44acff8-b382-4159-943e-6ce92bc9a299') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-d44acff8-b382-4159-943e-6ce92bc9a299') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-d44acff8-b382-4159-943e-6ce92bc9a299') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-7fa04c13-96a4-48de-b147-cf47a07c14ed') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-7fa04c13-96a4-48de-b147-cf47a07c14ed') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-7fa04c13-96a4-48de-b147-cf47a07c14ed') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-7fa04c13-96a4-48de-b147-cf47a07c14ed') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-d1df41d9-c875-4af7-b307-5f6c14af3c80') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-d1df41d9-c875-4af7-b307-5f6c14af3c80') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-d1df41d9-c875-4af7-b307-5f6c14af3c80') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-d1df41d9-c875-4af7-b307-5f6c14af3c80') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-a1d85f46-c8aa-4e37-a591-45cc067ae271') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-a1d85f46-c8aa-4e37-a591-45cc067ae271') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-a1d85f46-c8aa-4e37-a591-45cc067ae271') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-a1d85f46-c8aa-4e37-a591-45cc067ae271') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-b45c6a88-11de-4bfd-8a74-bad042736451') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-b45c6a88-11de-4bfd-8a74-bad042736451') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-b45c6a88-11de-4bfd-8a74-bad042736451') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-b45c6a88-11de-4bfd-8a74-bad042736451') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-3d693e43-1ffc-414f-aceb-57ee4b9ed509') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-3d693e43-1ffc-414f-aceb-57ee4b9ed509') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-3d693e43-1ffc-414f-aceb-57ee4b9ed509') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-3d693e43-1ffc-414f-aceb-57ee4b9ed509') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-621364fc-3637-48f4-a326-6ee3495b5f1f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-621364fc-3637-48f4-a326-6ee3495b5f1f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-621364fc-3637-48f4-a326-6ee3495b5f1f') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-621364fc-3637-48f4-a326-6ee3495b5f1f') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-edcb92ab-92ec-4804-bd51-bc103329e5df') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-edcb92ab-92ec-4804-bd51-bc103329e5df') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-edcb92ab-92ec-4804-bd51-bc103329e5df') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-edcb92ab-92ec-4804-bd51-bc103329e5df') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-d1bfaaad-32a5-49aa-aa73-98b46138c1b9') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-d1bfaaad-32a5-49aa-aa73-98b46138c1b9') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-d1bfaaad-32a5-49aa-aa73-98b46138c1b9') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-d1bfaaad-32a5-49aa-aa73-98b46138c1b9') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tablas</strong> (<strong>tables</strong> en inglés) nos permiten mostrar información de forma tabular. Su panel de campos es muy simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_01.jpg"></a>
...apenas un campo ("<em>Valores</em>") al que llevar aquellos campos o medidas de nuestro modelo de datos que queremos que formen las columnas de la tabla (lógicamente admite más de un campo o medida).
Por ejemplo, llevemos a <em>Valores</em> el campo <em>Country</em> (país en el que se realiza la venta) y las medidas <em>Sales</em> (suma de importes de venta) y <em>Units</em> (suma de unidades involucradas en cada venta):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_02.jpg"></a>
La tabla muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_03.jpg"></a>
Las columnas de las tablas son ajustables en anchura. Para ello podemos situar el cursor en el extremo derecho de la cabecera de una columna y pinchar y arrastrar. O situar el cursor en ese extremo derecho y hacer un doble clic para que el ancho se ajuste automáticamente de forma que se asegure que todos los valores de dicha columna son completamente visibles.
También es posible ordenar las columnas (de mayor a menor o viceversa, de A a la Z o viceversa, etc.) simplemente haciendo clic en la cabecera de las columnas. El orden vendrá indicado por un triángulo negro apuntando de arriba abajo o viceversa:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_04.jpg"></a>
También podemos hacer clic en los tres puntos que se muestran en la esquina superior derecha de la visualización para escoger el campo por el que queremos que se ordenen las filas de la tabla (y su orden, ascendente o descendente):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_05.jpg"></a>
Si se incluyen en esta visualización campos numéricos, se mostrará el total en la base de la columna (estos totales pueden deshabilitarse en el área de formato de la visualización: <em>Formato > Total > Totales</em>). La fila en la que se muestran estos totales -y los encabezados- permanecen siempre visibles aun cuando hagamos uso de la barra de desplazamiento vertical o redimensionemos la visualización.
Este total es el resultado de la medida (si lo que hemos llevado a <em>Valores</em> es un objeto de este tipo) o el resultado de aplicar una función de agregación que podemos escoger (si se trata de un campo).
Es posible aplicar a estas medidas y campos numéricos un formato condicional. Para ello hacemos clic en el triángulo invertido que se muestra a la derecha del nombre de dicho campo, seleccionamos <em>Formato condicional</em> y, a continuación, el tipo de formato deseado:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_06.jpg"></a>
Estas opciones de formato personalizado nos permiten modificar el color de fondo, el color de la fuente, añadir barras de datos así como iconos en función del valor que adopte algún campo (no tiene por qué ser necesariamente el valor del campo sobre el que estamos aplicando el formato condicional). Por ejemplo, si seleccionamos la opción <em>Color de fondo</em>, se nos muestra la siguiente ventana:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_07.jpg"></a>
En la parte superior de esta ventana se nos permite escoger el criterio:
<ul><li><strong>Escala de colores</strong>: Podemos escoger los valores más bajo y más alto (para un cierto campo o medida), y los colores asociados (podemos también seleccionar la opción divergente para añadir un valor y un color intermedio). Esta opción es la mostrada en la imagen anterior.</li>
<li><strong>Reglas</strong>: Con esta opción podemos especificar reglas cuyo cumplimiento se reflejará en la tabla mostrándose el fondo de la celda con el color escogido:</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_08.jpg"></a>
<ul><li><strong>Valor de campo</strong>: En esta tercera opción, se espera que el campo o medida escogida devuelva un color (es decir, que el campo o medida contenga valores del tipo "red", "blue"... o colores definidos por un valor hexadecimal como "#ff553c" o semejante):</li>
</ul><a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_09.jpg"></a>
Si, por ejemplo, seleccionamos la primera opción (<em>Escala de colores</em>) y dejamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_10.jpg"></a>
Es posible eliminar el formato condicional haciendo clic nuevamente en el triangulito invertido que se muestra a la derecha del nombre del campo y seleccionando <em>Quitar el formato condicional</em>. Como puede apreciarse en la siguiente imagen podemos eliminar todos los formatos condicionales que existan o un tipo concreto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_11.jpg"></a>
El formato condicional que permite modificar el color de la fuente muestra opciones semejantes a las vistas.
La opción de aplicar <em>barras de datos</em>, por el contrario, nos permite únicamente definir el valor más bajo y más alto a considerar, así como escoger los colores de las barras y la dirección de éstas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_12.jpg"></a>
Si, en este ejemplo, aceptamos las opciones por defecto, la visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_13.jpg"></a>
Por último, la opción de mostrar <em>iconos</em> nos permite mostrar un icono en cada celda según dos posibles criterios: aplicando <em>reglas</em> o según <em>valores de campo</em> (ambas opciones ya han sido comentadas):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_14.jpg"></a>
Además de varias otras opciones, podemos escoger el estilo de los iconos:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_15.jpg"></a>
Por ejemplo, si escogemos la medida <em>Sales</em> en la opción "<em>Según el campo</em>" que se muestra en la parte superior de la ventana, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/table_16.jpg"></a>
La visualización ofrece gran cantidad de opciones de personalización: para la cuadrícula (<em>Formato > Cuadrícula</em>) -activación o desactivación de las líneas verticales y horizontales que definen las celdas, colores por defecto de filas y columnas...-, encabezados de columna (color, familia de fuente, tamaño...), colores por defecto de la fuente y fondos a usar, formato de los totales, formato de cada uno de los campos que se hayan llevado a la tabla (color de fuente, del fondo, alineación, tipo de unidades a usar y número de decimales -solo para campos numéricos-...
Se trata de una visualización muy completa y 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', 'insert-max_800_px-9874a217-43c5-4763-b440-89b4e7edbdca') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-9874a217-43c5-4763-b440-89b4e7edbdca') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-9874a217-43c5-4763-b440-89b4e7edbdca') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-9874a217-43c5-4763-b440-89b4e7edbdca') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-bcd73194-6cd2-45a9-8c38-a350b630e3c7') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-bcd73194-6cd2-45a9-8c38-a350b630e3c7') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-bcd73194-6cd2-45a9-8c38-a350b630e3c7') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-bcd73194-6cd2-45a9-8c38-a350b630e3c7') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-ab04bf9e-344c-43d1-bbbe-b1953b897e68') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-ab04bf9e-344c-43d1-bbbe-b1953b897e68') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-ab04bf9e-344c-43d1-bbbe-b1953b897e68') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-ab04bf9e-344c-43d1-bbbe-b1953b897e68') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-c09e77ca-4704-43a9-a164-23940204c628') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-c09e77ca-4704-43a9-a164-23940204c628') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-c09e77ca-4704-43a9-a164-23940204c628') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-c09e77ca-4704-43a9-a164-23940204c628') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-fff5203a-6bc9-4c69-8287-11763977fcec') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-fff5203a-6bc9-4c69-8287-11763977fcec') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-fff5203a-6bc9-4c69-8287-11763977fcec') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-fff5203a-6bc9-4c69-8287-11763977fcec') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-89fa48cc-ed58-4da6-8261-9196f2c038a9') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-89fa48cc-ed58-4da6-8261-9196f2c038a9') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-89fa48cc-ed58-4da6-8261-9196f2c038a9') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-89fa48cc-ed58-4da6-8261-9196f2c038a9') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-b3ed14f9-1507-4558-be80-7e904e9bbc07') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-b3ed14f9-1507-4558-be80-7e904e9bbc07') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-b3ed14f9-1507-4558-be80-7e904e9bbc07') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-b3ed14f9-1507-4558-be80-7e904e9bbc07') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-ef19c871-5a72-4585-b392-d2ea3860921c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-ef19c871-5a72-4585-b392-d2ea3860921c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-ef19c871-5a72-4585-b392-d2ea3860921c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-ef19c871-5a72-4585-b392-d2ea3860921c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-e4e785ae-027c-4da8-bc37-3590a902b218') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-e4e785ae-027c-4da8-bc37-3590a902b218') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-e4e785ae-027c-4da8-bc37-3590a902b218') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-e4e785ae-027c-4da8-bc37-3590a902b218') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-267b5ff1-45ce-4fea-bb72-8f87c3bab6f2') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-267b5ff1-45ce-4fea-bb72-8f87c3bab6f2') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-267b5ff1-45ce-4fea-bb72-8f87c3bab6f2') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-267b5ff1-45ce-4fea-bb72-8f87c3bab6f2') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-5fa586c2-0ac7-47ed-be39-ba7617e3990a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-5fa586c2-0ac7-47ed-be39-ba7617e3990a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-5fa586c2-0ac7-47ed-be39-ba7617e3990a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-5fa586c2-0ac7-47ed-be39-ba7617e3990a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-cd1f6586-6b0c-4715-a35b-79a52be88871') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-cd1f6586-6b0c-4715-a35b-79a52be88871') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-cd1f6586-6b0c-4715-a35b-79a52be88871') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-cd1f6586-6b0c-4715-a35b-79a52be88871') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-0823cd3c-18b3-4d12-b8ff-2d38c27c9f6c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-0823cd3c-18b3-4d12-b8ff-2d38c27c9f6c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-0823cd3c-18b3-4d12-b8ff-2d38c27c9f6c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-0823cd3c-18b3-4d12-b8ff-2d38c27c9f6c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-2c9686b7-ebaa-440b-a0d4-02962a4ef986') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-2c9686b7-ebaa-440b-a0d4-02962a4ef986') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-2c9686b7-ebaa-440b-a0d4-02962a4ef986') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-2c9686b7-ebaa-440b-a0d4-02962a4ef986') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-7b27c809-e40b-4c85-8e5f-f46c64501392') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-7b27c809-e40b-4c85-8e5f-f46c64501392') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-7b27c809-e40b-4c85-8e5f-f46c64501392') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-7b27c809-e40b-4c85-8e5f-f46c64501392') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-b0322380-525a-4fcc-b619-b943c06aac89') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-b0322380-525a-4fcc-b619-b943c06aac89') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-b0322380-525a-4fcc-b619-b943c06aac89') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-b0322380-525a-4fcc-b619-b943c06aac89') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-8df18089-cace-440d-b94f-7e9af181936e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-8df18089-cace-440d-b94f-7e9af181936e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-8df18089-cace-440d-b94f-7e9af181936e') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-8df18089-cace-440d-b94f-7e9af181936e') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-ea90261b-6fa8-4014-a6ff-d8a197c32b38') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-ea90261b-6fa8-4014-a6ff-d8a197c32b38') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-ea90261b-6fa8-4014-a6ff-d8a197c32b38') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-ea90261b-6fa8-4014-a6ff-d8a197c32b38') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-ec00b272-7573-44ab-ae14-4415dd0f9194') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-ec00b272-7573-44ab-ae14-4415dd0f9194') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-ec00b272-7573-44ab-ae14-4415dd0f9194') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-ec00b272-7573-44ab-ae14-4415dd0f9194') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-dbb3bb35-e14a-4815-80e8-ac448247c69e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-dbb3bb35-e14a-4815-80e8-ac448247c69e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-dbb3bb35-e14a-4815-80e8-ac448247c69e') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-dbb3bb35-e14a-4815-80e8-ac448247c69e') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-a9dbe2a0-4b7e-4d23-a251-fb84b7a6aa91') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-a9dbe2a0-4b7e-4d23-a251-fb84b7a6aa91') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-a9dbe2a0-4b7e-4d23-a251-fb84b7a6aa91') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-a9dbe2a0-4b7e-4d23-a251-fb84b7a6aa91') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-e0f02db1-eb13-4793-a9db-95aafbc3536a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-e0f02db1-eb13-4793-a9db-95aafbc3536a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-e0f02db1-eb13-4793-a9db-95aafbc3536a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-e0f02db1-eb13-4793-a9db-95aafbc3536a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-6a9534fb-cbc1-41e9-8fbf-1d0859925b93') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-6a9534fb-cbc1-41e9-8fbf-1d0859925b93') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-6a9534fb-cbc1-41e9-8fbf-1d0859925b93') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-6a9534fb-cbc1-41e9-8fbf-1d0859925b93') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Las <strong>segmentaciones</strong> o <strong>slicers</strong> son una de las visualizaciones que más prácticas resultan pues permiten al usuario de nuestro informe (seamos nosotros o no) segmentar los datos del informe según el criterio controlado por la segmentación. Su panel de campos es sumamente simple:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_01.jpg"></a>
El único campo disponible (cuyo nombre es <em>Campo</em>), recibirá el campo (no se aceptan medidas) por cuyos valores se desea segmentar la información mostrada en el informe.
Por ejemplo, creemos una visualización de este tipo y llevemos el campo Country de nuestro modelo de datos al campo mencionado en esta visualización. Por defecto nos muestra un listado de los distintos valores que toma dicho campo, junto a casillas de selección que nos permiten seleccionar la opción que nos interesa (para visualizar mejor el efecto de la segmentación se incluye un mapa a su derecha mostrando las ventas por país):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_02.jpg"></a>
Vemos que se incluye una opción "(En blanco)" aun cuando no hay ventas que no tengan un país asociado.
Con un clic en alguna de las casillas de selección seleccionamos la opción que corresponda (y solo esa). Es decir, por defecto solo se admite una casilla seleccionada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_03.jpg"></a>
Podemos presionar la tecla <em>Control</em> mientras seleccionamos una opción para añadirla a la que ya exista. Otra forma de permitir selecciones múltiples es activar la opción Formato > Controles de selección > Selección única:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_04.jpg"></a>
En este caso, al haber seleccionado explícitamente los países que nos interesan, si en una actualización de los datos se añadiese un nuevo país, por defecto éste no se incluiría en la selección.
También podemos activar la opción de <em>Mostrar opción "Seleccionar todo"</em> en <em>Formato > Controles de selección,</em> en cuyo caso se mostrará también esta opción en el listado anterior:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_05.jpg"></a>
Si hacemos clic en esta opción se seleccionan todas las demás, y la opción de "<em>Seleccionar todo</em>" queda marcada con un punto indicando que, a partir de ese momento, estamos aplicando un filtro negativo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_06.jpg"></a>
Ahora, un clic en alguna de las restantes opciones la elimina del conjunto de valores seleccionados:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_07.jpg"></a>
Esto supone, por ejemplo, que si en una actualización de datos se añadiese un nuevo país, éste sí se seleccionaría por defecto (la segmentación anterior puede interpretarse como "selecciona todos los países menos Italia").
Un clic en el icono <em>Borrar selecciones</em> que se muestra en la parte superior de la visualización deselecciona todo (lo que supone que no se aplique ningún filtro a los países):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_08.jpg"></a>
A la derecha del icono anterior se muestra otro con aspecto de triángulo invertido, que nos permite modificar el tipo de interfaz mostrada por la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_09.jpg"></a>
Por defecto, la visualización muestra una interfaz tipo <em>Lista</em>. Si la cambiamos a <em>Menú desplegable</em> mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_10.jpg"></a>
Un clic en el texto <em>Todas</em> o en el triángulo invertido mostrado abrirá un menú con el listado de opciones.
Si hacemos clic en los tres puntos que se muestran en el extremo superior de la visualización se muestran opciones adicionales:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_11.jpg"></a>
Así, si seleccionamos la opción Buscar veremos cómo se muestra en la parte superior del listado de países un campo de búsqueda, vacío por defecto. A medida que escribamos cualquier texto en este campo, las opciones incluidas en el listado se irán filtrando para mostrar solo aquellas que incluyan el texto introducido, lo que resulta muy útil en el caso de que tengamos un listado de valores especialmente largo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_12.jpg"></a>
Un nuevo clic en los tres puntos y otro en <em>Buscar</em> oculta el campo de búsqueda.
Una opción muy útil es la de seleccionar la "orientación" de nuestra visualización, opción que podemos encontrar en <em>Formato > General > Orientación</em>. La opción por defecto es <em>Vertical</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_13.jpg"></a>
Hay que comentar que el nombre de esta opción no está nada bien escogido: "<em>Vertical</em>" quiere decir en realidad que el listado se va a mostrar en vertical y no se va a adaptar al tamaño de la visualización. La opción "<em>Horizontal</em>", por el contrario, significa que el listado se mostrará como un panel de botones en vertical o en horizontal en función del tamaño de la visualización. Por ejemplo, seleccionemos esta opción ("<em>Horizontal</em>") y estiremos la visualización hacia abajo (para hacerla muy alta y con el mismo ancho que tenía). Las opciones se muestran como botones en vertical, y un clic en uno de los botones lo selecciona, tal y como ocurría antes:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_14.jpg"></a>
Estaremos de acuerdo en que este formato no tiene mucho de "horizontal"...
Ahora, si ahora redimensionamos la visualización para que sea muy ancho y poco alta, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_15.jpg"></a>
Es posible personalizar los colores de los botones y del texto que se muestra en ellos en <em>Formato > Elementos</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_17.jpg"></a>
En la imagen anterior también se ha eliminado el texto ("<em>Country</em>") que se muestra por defecto en la esquina superior izquierda de la visualización (<em>Formato > Encabezado de segmentación</em>).
Con independencia del nombre de esta opción, resulta extremadamente útil y atractiva para crear menús que permitan al usuario del informe la fácil segmentación de los datos.
En el caso de que el campo a utilizar en la segmentación sea un campo de tipo fecha, las opciones aumentan. Por defecto se muestra en el lienzo una segmentación de tipo <em>slider</em>, que nos permite pinchar y arrastrar cualquiera de los dos extremos con el objetivo de especificar la primera y última fecha a incluir en el informe:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_18.jpg"></a>
Al hacer clic en alguno de los dos recuadros que indican la fecha seleccionada, se abre un calendario que nos permite buscar cómodamente la fecha de interés:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_19.jpg"></a>
Un clic en la etiqueta del mes o del año nos abre un listado vertical que nos permite desplazarnos rápidamente por el calendario:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_20.jpg"></a>
También es posible escribir directamente la fecha de interés en los recuadros comentados.
Se ha comentado que, por defecto, la visualización muestra una segmentación tipo <em>slider</em>. Pues bien, un clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha de la visualización nos muestra el resto de opciones disponibles:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_21.jpg"></a>
El nombre de la opción por defecto es <em>Entre</em>, pero podemos escoger la opción <em>Anterior a</em>, que nos permitirá escoger únicamente una fecha, seleccionando todas las anteriores, <em>Posterior a</em>, semejante a la anterior, <em>Lista</em>, mostrando un listado de fechas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_22.jpg"></a>
...<em>Menú desplegable</em>, semejante a la opción anterior pero en la que el listado de fechas se muestra como un menú que se abre al hacer clic en la visualización, y <em>Relativa</em>, opción muy útil que nos permite seleccionar fechas relativas a "algo". Ese "algo" puede ser el último período de tiempo, el siguiente o el actual, y una vez determinado este período de referencia, podemos escoger los N períodos que nos interesen, ya sean días, meses, años...:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_23.jpg"></a>
Si el campo que llevamos a la segmentación es de tipo numérico, se nos muestra una interfaz semejante a la de las fechas. En la siguiente imagen, por ejemplo, se ha llevado al campo <em>Campos</em> de la visualización el campo <em>Amount</em> que define el montante de cada venta:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/slicer_24.jpg"></a>
Al igual que con las fechas, podemos pinchar y arrastrar los extremos para limitar los valores incluidos en la selección, escribir directamente la cifra en el recuadro, hacer clic en el icono con forma de triángulo invertido que se muestra en la esquina superior derecha para visualizar otras opciones disponibles (<em>Entre</em>, <em>Menor o igual que</em>, etc.).
En función del campo que se esté utilizando para la segmentación (si es numérico o categórico) la visualización nos ofrece ciertas opciones adicionales para personalizar la visualización (colores, etc.).
En resumen, se trata de una visualización extremadamente útil y muy 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-5b8ca6ac-d74d-4b13-8154-cb45e47c31ad') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-5b8ca6ac-d74d-4b13-8154-cb45e47c31ad') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-5b8ca6ac-d74d-4b13-8154-cb45e47c31ad') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-5b8ca6ac-d74d-4b13-8154-cb45e47c31ad') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-1b15988d-8b6e-469f-badf-b7935b16550d') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-1b15988d-8b6e-469f-badf-b7935b16550d') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-1b15988d-8b6e-469f-badf-b7935b16550d') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-1b15988d-8b6e-469f-badf-b7935b16550d') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-833f2762-8cf8-4c06-a994-2a7289230eb8') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-833f2762-8cf8-4c06-a994-2a7289230eb8') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-833f2762-8cf8-4c06-a994-2a7289230eb8') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-833f2762-8cf8-4c06-a994-2a7289230eb8') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-4383749d-05ec-4f1e-80e2-0f08262e4e2f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-4383749d-05ec-4f1e-80e2-0f08262e4e2f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-4383749d-05ec-4f1e-80e2-0f08262e4e2f') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-4383749d-05ec-4f1e-80e2-0f08262e4e2f') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-409ffccc-5b28-4bad-a212-3f1ec091057c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-409ffccc-5b28-4bad-a212-3f1ec091057c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-409ffccc-5b28-4bad-a212-3f1ec091057c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-409ffccc-5b28-4bad-a212-3f1ec091057c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-0aae3884-2e7c-44a3-a6d8-ed33f734263a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-0aae3884-2e7c-44a3-a6d8-ed33f734263a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-0aae3884-2e7c-44a3-a6d8-ed33f734263a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-0aae3884-2e7c-44a3-a6d8-ed33f734263a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-eb9fe5c2-4266-422c-a208-b7265150d730') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-eb9fe5c2-4266-422c-a208-b7265150d730') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-eb9fe5c2-4266-422c-a208-b7265150d730') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-eb9fe5c2-4266-422c-a208-b7265150d730') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-9b66d42c-34ff-4eda-997a-1dcb59e00f18') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-9b66d42c-34ff-4eda-997a-1dcb59e00f18') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-9b66d42c-34ff-4eda-997a-1dcb59e00f18') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-9b66d42c-34ff-4eda-997a-1dcb59e00f18') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-333aaa03-824d-4ece-85d0-c7f40c2e4e4f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-333aaa03-824d-4ece-85d0-c7f40c2e4e4f') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-333aaa03-824d-4ece-85d0-c7f40c2e4e4f') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-333aaa03-824d-4ece-85d0-c7f40c2e4e4f') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-64447f03-8bed-4202-bc70-bf86ca81bcd9') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-64447f03-8bed-4202-bc70-bf86ca81bcd9') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-64447f03-8bed-4202-bc70-bf86ca81bcd9') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-64447f03-8bed-4202-bc70-bf86ca81bcd9') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>KPI</strong> o <strong>indicador</strong> es perfecto cuando queremos mostrar y destacar una cifra, pero referenciándola a los valores históricos de la misma. El panel de campos de esta visualización es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_01.jpg"></a>
En este tipo de visualizaciones trabajamos con una medida o campo del que extraer un valor numérico (tras aplicarle una operación de agregación), el criterio para establecer la referencia (que, como se ha comentado, típicamente será un criterio temporal como "Año", "Mes"...) y, potencialmente, un valor objetivo con el que comparar el valor mostrado.
<ul><li>Campo "<em>Indicador</em>": recibirá el campo del que extraer el valor numérico a mostrar. Solo admite uno.</li>
<li>Campo "<em>Eje de tendencia</em>": recibirá el campo que representará el criterio histórico con el que comparar el valor. Solo admite uno.</li>
<li>Campo "<em>Objetivos de destino</em>": recibirá el campo del que extraer el valor objetivo. Admite un máximo de dos campos.</li>
</ul>Llevemos, por ejemplo, nuestra medida <em>Sales</em> (medida que contiene la suma de los importes de venta) al campo <em>Indicador</em> de la visualización, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje de tendencia</em>. La visualización mostrará el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_02.jpg"></a>
En el centro se muestra el valor resultante de calcular la medida <em>Sales</em> en el contexto actual y, de fondo, la misma medida segmentada por años, mostrada con aspecto de gráfico de áreas. Es posible modificar el formato de este número en <em>Formato > Indicador</em> (podemos escoger las unidades, el número de decimales y el tamaño de la fuente).
Obsérvese que este gráfico de áreas no tiene como base el valor cero para el eje vertical. Si llevamos a una tabla las ventas por año:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_03.jpg"></a>
...comprobamos que el valor para el 2017 (1.3 millones) es el mínimo de la serie, y que la gráfica de áreas representa dicho valor en la base del eje vertical.
Si, en lugar del campo <em>Año</em>, llevamos al campo <em>Eje de tendencia</em> el campo <em>Date</em>, campo que contiene la fecha de cada venta, la visualización muestra las ventas por día (difícilmente interpretable):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_04.jpg"></a>
En estas circunstancias, el campo <em>Date</em> en cuestión no es interpretado como jerarquía:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_05.jpg"></a>
Pero si lo cambiamos a tipo "Jerarquía de fechas", la visualización muestra las ventas por año y no permite modificar su granularidad. Esto supone que si deseamos mostrar, por ejemplo, las ventas por mes (para un año específico), deberemos llevar el campo <em>Mes</em> a <em>Eje de tendencia</em> y filtrar adecuadamente el año (ya sea en la propia visualización, en el informe, etc.).
Si ahora llevamos un campo de nuestro modelo de datos (y seleccionamos una función de agregación) o una medida al campo <em>Objetivos de destino</em> de la visualización, el color del área mostrada detrás de nuestra cifra de venta se modificará, mostrándose en verde si nuestra cifra ha superado o iguala el objetivo, o en rojo si no lo ha hecho. Por ejemplo, en nuestro caso la cifra de ventas es de poco más de 2 millones de euros. Si llevamos a <em>Objetivos de destino</em> una sencilla medida que simplemente devuelva el valor 1.800.000, la visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_06.jpg"></a>
Por el contrario, si esta última medida devuelve una cifra mayor que nuestras ventas actuales, por ejemplo, 3.000.000, el área se muestra en rojo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_07.jpg"></a>
Vemos que no solo se modifica el color del área, sino también el color de la fuente en la que se muestra nuestro valor actual.
Estos colores son personalizables en <em>Formato > Codificación del color</em>, pudiendo además especificar si una cifra más alta que el objetivo es mejor o peor:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_08.jpg"></a>
Vemos en las imágenes anteriores que la cifra objetivo se muestra debajo de nuestra cifra actual, incluyendo la diferencia porcentual entre ambos valores. El formato de la cifra objetivo no puede personalizarse a través de la visualización. No podemos, por ejemplo, modificar su tamaño. Sí podemos añadir, por ejemplo separador de miles, aunque deberemos hacerlo usando la herramienta de formato de Power BI (<em>Cinta de opciones > Modelado > Formato</em>).
El campo <em>Objetivo de destino</em> de la visualización admite más de un campo o medidas de nuestro modelo de datos, modificándose ligeramente el comportamiento de la visualización. Para verlo, definamos otra medida que devuelva el valor mínimo de ventas objetivo:
Minimum Sales = 1500000
...y llevémosla por debajo de la medida <em>Sales objective</em> que ya teníamos en <em>Objetivo de destino</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_09.jpg"></a>
Ahora le estamos dando a la visualización dos objetivos, y el color a mostrar dependerá de si se cumplen ambos, ninguno o uno solo. En nuestro ejemplo, con ventas de poco más de 2 millones de euros, no superamos la cifra devuelva por la medida <em>Sales objective</em> (3 millones), pero sí superamos la devuelta por <em>Minimum Sales</em> (un millón y medio), por lo que la visualización se muestra en color amarillo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/kpi_10.jpg"></a>
Comprobamos que se muestran ambas cifras objetivo debajo de nuestra cifra actual pero se oculta el porcentaje que supone nuestra cifra actual con respecto a ellas.
Si se superasen ambas cifras la visualización se mostraría en verde, y si no se superase ninguna, se mostraría en rojo, como ya hemos visto.
Esta visualización no muestra la clásica ventana emergente con la información asociada cuando movemos el cursor por encima de ella.
La visualización permite alguna personalización adicional: inhabilitar el eje de tendencia (con lo que no se mostraría el gráfico de áreas), así como ocultar las cifras objetivo o el porcentaje que supone la cifra actual con respecto al objetivo.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-6df4baad-3eb1-4acf-8f4b-93e98ab28b79') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tarjeta de varias filas</strong> o <strong>Multi-row card</strong> es de utilidad cuando queremos mostrar un conjunto de cifras independientes de cualquier otra referencia. Su panel de campos es tan sencillo como el de la visualización tipo <a href="/powerbi/visual/card-tarjeta">tarjeta</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_01.jpg"></a>
La visualización solo tiene un campo que aceptará los campos o medidas de nuestro modelo de datos (pueden ser varios) de los que extraer un valor numérico:
<ul><li>Campo “<em>Campos</em>”: recibe los campos y medidas cuyos valores numéricos queremos representar.</li>
</ul>Por ejemplo, si llevamos a la visualización las medidas <em>Sales</em> y <em>Margin</em>, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_02.jpg"></a>
En el caso de tratarse de medidas, se calcularán y se mostrará el valor resultante. Si se trata de campos numéricos, se les aplicará una función de agregación que podemos escoger. En la siguiente imagen, por ejemplo, se ha llevado el campo <em>Units</em> de la tabla <em>Sales</em> que contiene el número de unidades implicadas en cada operación de venta. Puede verse que disponemos de varias funciones de agregación entre las que escoger:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_03.jpg"></a>
En esta visualización, el formato de los valores numéricos es automático y no puede personalizarse, lo que limita un poco su utilidad.
Podemos añadir texto al valor a mostrar creando una medida calculada como el resultado de la concatenación del texto que nos interese y de la fórmula cuyo resultado queramos mostrar. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización como cualquier otra. Véase el ejemplo incluido en la visualización <a href="/powerbi/visual/card-tarjeta">Tarjeta</a>.
Como se aprecia en la primera imagen mostrada, la visualización incluye una barra vertical a la izquierda de las cifras y etiquetas. Esta barra puede ocultarse o personalizarse (color y grosor). También podemos añadir un marco (pudiendo especificar los laterales en los que se muestra, su color y grosor). En la siguiente imagen se ha modificado la barra para mostrar un grosor de 4 (¿píxels?), color azul oscuro y un marco (llamado "esquema" en el panel de formato) en los cuatro laterales de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_04.jpg"></a>
Esta personalización se realiza en <em>Formato > Tarjeta</em>.
El "esquema" es independiente del borde que puede mostrarse alrededor de cualquier visualización en Power BI (la única ventaja del esquema es que podemos aplicarlo a los lados que deseemos, mientras que el borde se aplica a los cuatro laterales).
Adicionalmente podemos dar formato a las etiquetas de los datos (color, tamaño de fuente y familia) -ya se ha comentado que no se puede especificar el formato numérico-, y a las etiquetas de texto que se muestran debajo de los valores (nuevamente, color, tamaño de fuente y familia).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-6df4baad-3eb1-4acf-8f4b-93e98ab28b79') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tarjeta de varias filas</strong> o <strong>Multi-row card</strong> es de utilidad cuando queremos mostrar un conjunto de cifras independientes de cualquier otra referencia. Su panel de campos es tan sencillo como el de la visualización tipo <a href="/powerbi/visual/card-tarjeta">tarjeta</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_01.jpg"></a>
La visualización solo tiene un campo que aceptará los campos o medidas de nuestro modelo de datos (pueden ser varios) de los que extraer un valor numérico:
<ul><li>Campo “<em>Campos</em>”: recibe los campos y medidas cuyos valores numéricos queremos representar.</li>
</ul>Por ejemplo, si llevamos a la visualización las medidas <em>Sales</em> y <em>Margin</em>, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_02.jpg"></a>
En el caso de tratarse de medidas, se calcularán y se mostrará el valor resultante. Si se trata de campos numéricos, se les aplicará una función de agregación que podemos escoger. En la siguiente imagen, por ejemplo, se ha llevado el campo <em>Units</em> de la tabla <em>Sales</em> que contiene el número de unidades implicadas en cada operación de venta. Puede verse que disponemos de varias funciones de agregación entre las que escoger:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_03.jpg"></a>
En esta visualización, el formato de los valores numéricos es automático y no puede personalizarse, lo que limita un poco su utilidad.
Podemos añadir texto al valor a mostrar creando una medida calculada como el resultado de la concatenación del texto que nos interese y de la fórmula cuyo resultado queramos mostrar. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización como cualquier otra. Véase el ejemplo incluido en la visualización <a href="/powerbi/visual/card-tarjeta">Tarjeta</a>.
Como se aprecia en la primera imagen mostrada, la visualización incluye una barra vertical a la izquierda de las cifras y etiquetas. Esta barra puede ocultarse o personalizarse (color y grosor). También podemos añadir un marco (pudiendo especificar los laterales en los que se muestra, su color y grosor). En la siguiente imagen se ha modificado la barra para mostrar un grosor de 4 (¿píxels?), color azul oscuro y un marco (llamado "esquema" en el panel de formato) en los cuatro laterales de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_04.jpg"></a>
Esta personalización se realiza en <em>Formato > Tarjeta</em>.
El "esquema" es independiente del borde que puede mostrarse alrededor de cualquier visualización en Power BI (la única ventaja del esquema es que podemos aplicarlo a los lados que deseemos, mientras que el borde se aplica a los cuatro laterales).
Adicionalmente podemos dar formato a las etiquetas de los datos (color, tamaño de fuente y familia) -ya se ha comentado que no se puede especificar el formato numérico-, y a las etiquetas de texto que se muestran debajo de los valores (nuevamente, color, tamaño de fuente y familia).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-6df4baad-3eb1-4acf-8f4b-93e98ab28b79') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tarjeta de varias filas</strong> o <strong>Multi-row card</strong> es de utilidad cuando queremos mostrar un conjunto de cifras independientes de cualquier otra referencia. Su panel de campos es tan sencillo como el de la visualización tipo <a href="/powerbi/visual/card-tarjeta">tarjeta</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_01.jpg"></a>
La visualización solo tiene un campo que aceptará los campos o medidas de nuestro modelo de datos (pueden ser varios) de los que extraer un valor numérico:
<ul><li>Campo “<em>Campos</em>”: recibe los campos y medidas cuyos valores numéricos queremos representar.</li>
</ul>Por ejemplo, si llevamos a la visualización las medidas <em>Sales</em> y <em>Margin</em>, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_02.jpg"></a>
En el caso de tratarse de medidas, se calcularán y se mostrará el valor resultante. Si se trata de campos numéricos, se les aplicará una función de agregación que podemos escoger. En la siguiente imagen, por ejemplo, se ha llevado el campo <em>Units</em> de la tabla <em>Sales</em> que contiene el número de unidades implicadas en cada operación de venta. Puede verse que disponemos de varias funciones de agregación entre las que escoger:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_03.jpg"></a>
En esta visualización, el formato de los valores numéricos es automático y no puede personalizarse, lo que limita un poco su utilidad.
Podemos añadir texto al valor a mostrar creando una medida calculada como el resultado de la concatenación del texto que nos interese y de la fórmula cuyo resultado queramos mostrar. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización como cualquier otra. Véase el ejemplo incluido en la visualización <a href="/powerbi/visual/card-tarjeta">Tarjeta</a>.
Como se aprecia en la primera imagen mostrada, la visualización incluye una barra vertical a la izquierda de las cifras y etiquetas. Esta barra puede ocultarse o personalizarse (color y grosor). También podemos añadir un marco (pudiendo especificar los laterales en los que se muestra, su color y grosor). En la siguiente imagen se ha modificado la barra para mostrar un grosor de 4 (¿píxels?), color azul oscuro y un marco (llamado "esquema" en el panel de formato) en los cuatro laterales de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_04.jpg"></a>
Esta personalización se realiza en <em>Formato > Tarjeta</em>.
El "esquema" es independiente del borde que puede mostrarse alrededor de cualquier visualización en Power BI (la única ventaja del esquema es que podemos aplicarlo a los lados que deseemos, mientras que el borde se aplica a los cuatro laterales).
Adicionalmente podemos dar formato a las etiquetas de los datos (color, tamaño de fuente y familia) -ya se ha comentado que no se puede especificar el formato numérico-, y a las etiquetas de texto que se muestran debajo de los valores (nuevamente, color, tamaño de fuente y familia).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-6df4baad-3eb1-4acf-8f4b-93e98ab28b79') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tarjeta de varias filas</strong> o <strong>Multi-row card</strong> es de utilidad cuando queremos mostrar un conjunto de cifras independientes de cualquier otra referencia. Su panel de campos es tan sencillo como el de la visualización tipo <a href="/powerbi/visual/card-tarjeta">tarjeta</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_01.jpg"></a>
La visualización solo tiene un campo que aceptará los campos o medidas de nuestro modelo de datos (pueden ser varios) de los que extraer un valor numérico:
<ul><li>Campo “<em>Campos</em>”: recibe los campos y medidas cuyos valores numéricos queremos representar.</li>
</ul>Por ejemplo, si llevamos a la visualización las medidas <em>Sales</em> y <em>Margin</em>, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_02.jpg"></a>
En el caso de tratarse de medidas, se calcularán y se mostrará el valor resultante. Si se trata de campos numéricos, se les aplicará una función de agregación que podemos escoger. En la siguiente imagen, por ejemplo, se ha llevado el campo <em>Units</em> de la tabla <em>Sales</em> que contiene el número de unidades implicadas en cada operación de venta. Puede verse que disponemos de varias funciones de agregación entre las que escoger:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_03.jpg"></a>
En esta visualización, el formato de los valores numéricos es automático y no puede personalizarse, lo que limita un poco su utilidad.
Podemos añadir texto al valor a mostrar creando una medida calculada como el resultado de la concatenación del texto que nos interese y de la fórmula cuyo resultado queramos mostrar. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización como cualquier otra. Véase el ejemplo incluido en la visualización <a href="/powerbi/visual/card-tarjeta">Tarjeta</a>.
Como se aprecia en la primera imagen mostrada, la visualización incluye una barra vertical a la izquierda de las cifras y etiquetas. Esta barra puede ocultarse o personalizarse (color y grosor). También podemos añadir un marco (pudiendo especificar los laterales en los que se muestra, su color y grosor). En la siguiente imagen se ha modificado la barra para mostrar un grosor de 4 (¿píxels?), color azul oscuro y un marco (llamado "esquema" en el panel de formato) en los cuatro laterales de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_04.jpg"></a>
Esta personalización se realiza en <em>Formato > Tarjeta</em>.
El "esquema" es independiente del borde que puede mostrarse alrededor de cualquier visualización en Power BI (la única ventaja del esquema es que podemos aplicarlo a los lados que deseemos, mientras que el borde se aplica a los cuatro laterales).
Adicionalmente podemos dar formato a las etiquetas de los datos (color, tamaño de fuente y familia) -ya se ha comentado que no se puede especificar el formato numérico-, y a las etiquetas de texto que se muestran debajo de los valores (nuevamente, color, tamaño de fuente y familia).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-33c259c1-03af-4f81-985b-76f497b7ad13') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tarjeta de varias filas</strong> o <strong>Multi-row card</strong> es de utilidad cuando queremos mostrar un conjunto de cifras independientes de cualquier otra referencia. Su panel de campos es tan sencillo como el de la visualización tipo <a href="/powerbi/visual/card-tarjeta">tarjeta</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_01.jpg"></a>
La visualización solo tiene un campo que aceptará los campos o medidas de nuestro modelo de datos (pueden ser varios) de los que extraer un valor numérico:
<ul><li>Campo “<em>Campos</em>”: recibe los campos y medidas cuyos valores numéricos queremos representar.</li>
</ul>Por ejemplo, si llevamos a la visualización las medidas <em>Sales</em> y <em>Margin</em>, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_02.jpg"></a>
En el caso de tratarse de medidas, se calcularán y se mostrará el valor resultante. Si se trata de campos numéricos, se les aplicará una función de agregación que podemos escoger. En la siguiente imagen, por ejemplo, se ha llevado el campo <em>Units</em> de la tabla <em>Sales</em> que contiene el número de unidades implicadas en cada operación de venta. Puede verse que disponemos de varias funciones de agregación entre las que escoger:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_03.jpg"></a>
En esta visualización, el formato de los valores numéricos es automático y no puede personalizarse, lo que limita un poco su utilidad.
Podemos añadir texto al valor a mostrar creando una medida calculada como el resultado de la concatenación del texto que nos interese y de la fórmula cuyo resultado queramos mostrar. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización como cualquier otra. Véase el ejemplo incluido en la visualización <a href="/powerbi/visual/card-tarjeta">Tarjeta</a>.
Como se aprecia en la primera imagen mostrada, la visualización incluye una barra vertical a la izquierda de las cifras y etiquetas. Esta barra puede ocultarse o personalizarse (color y grosor). También podemos añadir un marco (pudiendo especificar los laterales en los que se muestra, su color y grosor). En la siguiente imagen se ha modificado la barra para mostrar un grosor de 4 (¿píxels?), color azul oscuro y un marco (llamado "esquema" en el panel de formato) en los cuatro laterales de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_04.jpg"></a>
Esta personalización se realiza en <em>Formato > Tarjeta</em>.
El "esquema" es independiente del borde que puede mostrarse alrededor de cualquier visualización en Power BI (la única ventaja del esquema es que podemos aplicarlo a los lados que deseemos, mientras que el borde se aplica a los cuatro laterales).
Adicionalmente podemos dar formato a las etiquetas de los datos (color, tamaño de fuente y familia) -ya se ha comentado que no se puede especificar el formato numérico-, y a las etiquetas de texto que se muestran debajo de los valores (nuevamente, color, tamaño de fuente y familia).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-33c259c1-03af-4f81-985b-76f497b7ad13') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tarjeta de varias filas</strong> o <strong>Multi-row card</strong> es de utilidad cuando queremos mostrar un conjunto de cifras independientes de cualquier otra referencia. Su panel de campos es tan sencillo como el de la visualización tipo <a href="/powerbi/visual/card-tarjeta">tarjeta</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_01.jpg"></a>
La visualización solo tiene un campo que aceptará los campos o medidas de nuestro modelo de datos (pueden ser varios) de los que extraer un valor numérico:
<ul><li>Campo “<em>Campos</em>”: recibe los campos y medidas cuyos valores numéricos queremos representar.</li>
</ul>Por ejemplo, si llevamos a la visualización las medidas <em>Sales</em> y <em>Margin</em>, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_02.jpg"></a>
En el caso de tratarse de medidas, se calcularán y se mostrará el valor resultante. Si se trata de campos numéricos, se les aplicará una función de agregación que podemos escoger. En la siguiente imagen, por ejemplo, se ha llevado el campo <em>Units</em> de la tabla <em>Sales</em> que contiene el número de unidades implicadas en cada operación de venta. Puede verse que disponemos de varias funciones de agregación entre las que escoger:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_03.jpg"></a>
En esta visualización, el formato de los valores numéricos es automático y no puede personalizarse, lo que limita un poco su utilidad.
Podemos añadir texto al valor a mostrar creando una medida calculada como el resultado de la concatenación del texto que nos interese y de la fórmula cuyo resultado queramos mostrar. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización como cualquier otra. Véase el ejemplo incluido en la visualización <a href="/powerbi/visual/card-tarjeta">Tarjeta</a>.
Como se aprecia en la primera imagen mostrada, la visualización incluye una barra vertical a la izquierda de las cifras y etiquetas. Esta barra puede ocultarse o personalizarse (color y grosor). También podemos añadir un marco (pudiendo especificar los laterales en los que se muestra, su color y grosor). En la siguiente imagen se ha modificado la barra para mostrar un grosor de 4 (¿píxels?), color azul oscuro y un marco (llamado "esquema" en el panel de formato) en los cuatro laterales de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_04.jpg"></a>
Esta personalización se realiza en <em>Formato > Tarjeta</em>.
El "esquema" es independiente del borde que puede mostrarse alrededor de cualquier visualización en Power BI (la única ventaja del esquema es que podemos aplicarlo a los lados que deseemos, mientras que el borde se aplica a los cuatro laterales).
Adicionalmente podemos dar formato a las etiquetas de los datos (color, tamaño de fuente y familia) -ya se ha comentado que no se puede especificar el formato numérico-, y a las etiquetas de texto que se muestran debajo de los valores (nuevamente, color, tamaño de fuente y familia).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-33c259c1-03af-4f81-985b-76f497b7ad13') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tarjeta de varias filas</strong> o <strong>Multi-row card</strong> es de utilidad cuando queremos mostrar un conjunto de cifras independientes de cualquier otra referencia. Su panel de campos es tan sencillo como el de la visualización tipo <a href="/powerbi/visual/card-tarjeta">tarjeta</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_01.jpg"></a>
La visualización solo tiene un campo que aceptará los campos o medidas de nuestro modelo de datos (pueden ser varios) de los que extraer un valor numérico:
<ul><li>Campo “<em>Campos</em>”: recibe los campos y medidas cuyos valores numéricos queremos representar.</li>
</ul>Por ejemplo, si llevamos a la visualización las medidas <em>Sales</em> y <em>Margin</em>, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_02.jpg"></a>
En el caso de tratarse de medidas, se calcularán y se mostrará el valor resultante. Si se trata de campos numéricos, se les aplicará una función de agregación que podemos escoger. En la siguiente imagen, por ejemplo, se ha llevado el campo <em>Units</em> de la tabla <em>Sales</em> que contiene el número de unidades implicadas en cada operación de venta. Puede verse que disponemos de varias funciones de agregación entre las que escoger:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_03.jpg"></a>
En esta visualización, el formato de los valores numéricos es automático y no puede personalizarse, lo que limita un poco su utilidad.
Podemos añadir texto al valor a mostrar creando una medida calculada como el resultado de la concatenación del texto que nos interese y de la fórmula cuyo resultado queramos mostrar. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización como cualquier otra. Véase el ejemplo incluido en la visualización <a href="/powerbi/visual/card-tarjeta">Tarjeta</a>.
Como se aprecia en la primera imagen mostrada, la visualización incluye una barra vertical a la izquierda de las cifras y etiquetas. Esta barra puede ocultarse o personalizarse (color y grosor). También podemos añadir un marco (pudiendo especificar los laterales en los que se muestra, su color y grosor). En la siguiente imagen se ha modificado la barra para mostrar un grosor de 4 (¿píxels?), color azul oscuro y un marco (llamado "esquema" en el panel de formato) en los cuatro laterales de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_04.jpg"></a>
Esta personalización se realiza en <em>Formato > Tarjeta</em>.
El "esquema" es independiente del borde que puede mostrarse alrededor de cualquier visualización en Power BI (la única ventaja del esquema es que podemos aplicarlo a los lados que deseemos, mientras que el borde se aplica a los cuatro laterales).
Adicionalmente podemos dar formato a las etiquetas de los datos (color, tamaño de fuente y familia) -ya se ha comentado que no se puede especificar el formato numérico-, y a las etiquetas de texto que se muestran debajo de los valores (nuevamente, color, tamaño de fuente y familia).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-33c259c1-03af-4f81-985b-76f497b7ad13') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tarjeta de varias filas</strong> o <strong>Multi-row card</strong> es de utilidad cuando queremos mostrar un conjunto de cifras independientes de cualquier otra referencia. Su panel de campos es tan sencillo como el de la visualización tipo <a href="/powerbi/visual/card-tarjeta">tarjeta</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_01.jpg"></a>
La visualización solo tiene un campo que aceptará los campos o medidas de nuestro modelo de datos (pueden ser varios) de los que extraer un valor numérico:
<ul><li>Campo “<em>Campos</em>”: recibe los campos y medidas cuyos valores numéricos queremos representar.</li>
</ul>Por ejemplo, si llevamos a la visualización las medidas <em>Sales</em> y <em>Margin</em>, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_02.jpg"></a>
En el caso de tratarse de medidas, se calcularán y se mostrará el valor resultante. Si se trata de campos numéricos, se les aplicará una función de agregación que podemos escoger. En la siguiente imagen, por ejemplo, se ha llevado el campo <em>Units</em> de la tabla <em>Sales</em> que contiene el número de unidades implicadas en cada operación de venta. Puede verse que disponemos de varias funciones de agregación entre las que escoger:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_03.jpg"></a>
En esta visualización, el formato de los valores numéricos es automático y no puede personalizarse, lo que limita un poco su utilidad.
Podemos añadir texto al valor a mostrar creando una medida calculada como el resultado de la concatenación del texto que nos interese y de la fórmula cuyo resultado queramos mostrar. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización como cualquier otra. Véase el ejemplo incluido en la visualización <a href="/powerbi/visual/card-tarjeta">Tarjeta</a>.
Como se aprecia en la primera imagen mostrada, la visualización incluye una barra vertical a la izquierda de las cifras y etiquetas. Esta barra puede ocultarse o personalizarse (color y grosor). También podemos añadir un marco (pudiendo especificar los laterales en los que se muestra, su color y grosor). En la siguiente imagen se ha modificado la barra para mostrar un grosor de 4 (¿píxels?), color azul oscuro y un marco (llamado "esquema" en el panel de formato) en los cuatro laterales de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_04.jpg"></a>
Esta personalización se realiza en <em>Formato > Tarjeta</em>.
El "esquema" es independiente del borde que puede mostrarse alrededor de cualquier visualización en Power BI (la única ventaja del esquema es que podemos aplicarlo a los lados que deseemos, mientras que el borde se aplica a los cuatro laterales).
Adicionalmente podemos dar formato a las etiquetas de los datos (color, tamaño de fuente y familia) -ya se ha comentado que no se puede especificar el formato numérico-, y a las etiquetas de texto que se muestran debajo de los valores (nuevamente, color, tamaño de fuente y familia).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-af0cdc4b-40eb-4cf6-be19-230ab780e7e8') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tarjeta de varias filas</strong> o <strong>Multi-row card</strong> es de utilidad cuando queremos mostrar un conjunto de cifras independientes de cualquier otra referencia. Su panel de campos es tan sencillo como el de la visualización tipo <a href="/powerbi/visual/card-tarjeta">tarjeta</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_01.jpg"></a>
La visualización solo tiene un campo que aceptará los campos o medidas de nuestro modelo de datos (pueden ser varios) de los que extraer un valor numérico:
<ul><li>Campo “<em>Campos</em>”: recibe los campos y medidas cuyos valores numéricos queremos representar.</li>
</ul>Por ejemplo, si llevamos a la visualización las medidas <em>Sales</em> y <em>Margin</em>, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_02.jpg"></a>
En el caso de tratarse de medidas, se calcularán y se mostrará el valor resultante. Si se trata de campos numéricos, se les aplicará una función de agregación que podemos escoger. En la siguiente imagen, por ejemplo, se ha llevado el campo <em>Units</em> de la tabla <em>Sales</em> que contiene el número de unidades implicadas en cada operación de venta. Puede verse que disponemos de varias funciones de agregación entre las que escoger:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_03.jpg"></a>
En esta visualización, el formato de los valores numéricos es automático y no puede personalizarse, lo que limita un poco su utilidad.
Podemos añadir texto al valor a mostrar creando una medida calculada como el resultado de la concatenación del texto que nos interese y de la fórmula cuyo resultado queramos mostrar. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización como cualquier otra. Véase el ejemplo incluido en la visualización <a href="/powerbi/visual/card-tarjeta">Tarjeta</a>.
Como se aprecia en la primera imagen mostrada, la visualización incluye una barra vertical a la izquierda de las cifras y etiquetas. Esta barra puede ocultarse o personalizarse (color y grosor). También podemos añadir un marco (pudiendo especificar los laterales en los que se muestra, su color y grosor). En la siguiente imagen se ha modificado la barra para mostrar un grosor de 4 (¿píxels?), color azul oscuro y un marco (llamado "esquema" en el panel de formato) en los cuatro laterales de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_04.jpg"></a>
Esta personalización se realiza en <em>Formato > Tarjeta</em>.
El "esquema" es independiente del borde que puede mostrarse alrededor de cualquier visualización en Power BI (la única ventaja del esquema es que podemos aplicarlo a los lados que deseemos, mientras que el borde se aplica a los cuatro laterales).
Adicionalmente podemos dar formato a las etiquetas de los datos (color, tamaño de fuente y familia) -ya se ha comentado que no se puede especificar el formato numérico-, y a las etiquetas de texto que se muestran debajo de los valores (nuevamente, color, tamaño de fuente y familia).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-af0cdc4b-40eb-4cf6-be19-230ab780e7e8') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tarjeta de varias filas</strong> o <strong>Multi-row card</strong> es de utilidad cuando queremos mostrar un conjunto de cifras independientes de cualquier otra referencia. Su panel de campos es tan sencillo como el de la visualización tipo <a href="/powerbi/visual/card-tarjeta">tarjeta</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_01.jpg"></a>
La visualización solo tiene un campo que aceptará los campos o medidas de nuestro modelo de datos (pueden ser varios) de los que extraer un valor numérico:
<ul><li>Campo “<em>Campos</em>”: recibe los campos y medidas cuyos valores numéricos queremos representar.</li>
</ul>Por ejemplo, si llevamos a la visualización las medidas <em>Sales</em> y <em>Margin</em>, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_02.jpg"></a>
En el caso de tratarse de medidas, se calcularán y se mostrará el valor resultante. Si se trata de campos numéricos, se les aplicará una función de agregación que podemos escoger. En la siguiente imagen, por ejemplo, se ha llevado el campo <em>Units</em> de la tabla <em>Sales</em> que contiene el número de unidades implicadas en cada operación de venta. Puede verse que disponemos de varias funciones de agregación entre las que escoger:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_03.jpg"></a>
En esta visualización, el formato de los valores numéricos es automático y no puede personalizarse, lo que limita un poco su utilidad.
Podemos añadir texto al valor a mostrar creando una medida calculada como el resultado de la concatenación del texto que nos interese y de la fórmula cuyo resultado queramos mostrar. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización como cualquier otra. Véase el ejemplo incluido en la visualización <a href="/powerbi/visual/card-tarjeta">Tarjeta</a>.
Como se aprecia en la primera imagen mostrada, la visualización incluye una barra vertical a la izquierda de las cifras y etiquetas. Esta barra puede ocultarse o personalizarse (color y grosor). También podemos añadir un marco (pudiendo especificar los laterales en los que se muestra, su color y grosor). En la siguiente imagen se ha modificado la barra para mostrar un grosor de 4 (¿píxels?), color azul oscuro y un marco (llamado "esquema" en el panel de formato) en los cuatro laterales de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_04.jpg"></a>
Esta personalización se realiza en <em>Formato > Tarjeta</em>.
El "esquema" es independiente del borde que puede mostrarse alrededor de cualquier visualización en Power BI (la única ventaja del esquema es que podemos aplicarlo a los lados que deseemos, mientras que el borde se aplica a los cuatro laterales).
Adicionalmente podemos dar formato a las etiquetas de los datos (color, tamaño de fuente y familia) -ya se ha comentado que no se puede especificar el formato numérico-, y a las etiquetas de texto que se muestran debajo de los valores (nuevamente, color, tamaño de fuente y familia).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-af0cdc4b-40eb-4cf6-be19-230ab780e7e8') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tarjeta de varias filas</strong> o <strong>Multi-row card</strong> es de utilidad cuando queremos mostrar un conjunto de cifras independientes de cualquier otra referencia. Su panel de campos es tan sencillo como el de la visualización tipo <a href="/powerbi/visual/card-tarjeta">tarjeta</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_01.jpg"></a>
La visualización solo tiene un campo que aceptará los campos o medidas de nuestro modelo de datos (pueden ser varios) de los que extraer un valor numérico:
<ul><li>Campo “<em>Campos</em>”: recibe los campos y medidas cuyos valores numéricos queremos representar.</li>
</ul>Por ejemplo, si llevamos a la visualización las medidas <em>Sales</em> y <em>Margin</em>, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_02.jpg"></a>
En el caso de tratarse de medidas, se calcularán y se mostrará el valor resultante. Si se trata de campos numéricos, se les aplicará una función de agregación que podemos escoger. En la siguiente imagen, por ejemplo, se ha llevado el campo <em>Units</em> de la tabla <em>Sales</em> que contiene el número de unidades implicadas en cada operación de venta. Puede verse que disponemos de varias funciones de agregación entre las que escoger:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_03.jpg"></a>
En esta visualización, el formato de los valores numéricos es automático y no puede personalizarse, lo que limita un poco su utilidad.
Podemos añadir texto al valor a mostrar creando una medida calculada como el resultado de la concatenación del texto que nos interese y de la fórmula cuyo resultado queramos mostrar. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización como cualquier otra. Véase el ejemplo incluido en la visualización <a href="/powerbi/visual/card-tarjeta">Tarjeta</a>.
Como se aprecia en la primera imagen mostrada, la visualización incluye una barra vertical a la izquierda de las cifras y etiquetas. Esta barra puede ocultarse o personalizarse (color y grosor). También podemos añadir un marco (pudiendo especificar los laterales en los que se muestra, su color y grosor). En la siguiente imagen se ha modificado la barra para mostrar un grosor de 4 (¿píxels?), color azul oscuro y un marco (llamado "esquema" en el panel de formato) en los cuatro laterales de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_04.jpg"></a>
Esta personalización se realiza en <em>Formato > Tarjeta</em>.
El "esquema" es independiente del borde que puede mostrarse alrededor de cualquier visualización en Power BI (la única ventaja del esquema es que podemos aplicarlo a los lados que deseemos, mientras que el borde se aplica a los cuatro laterales).
Adicionalmente podemos dar formato a las etiquetas de los datos (color, tamaño de fuente y familia) -ya se ha comentado que no se puede especificar el formato numérico-, y a las etiquetas de texto que se muestran debajo de los valores (nuevamente, color, tamaño de fuente y familia).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-af0cdc4b-40eb-4cf6-be19-230ab780e7e8') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tarjeta de varias filas</strong> o <strong>Multi-row card</strong> es de utilidad cuando queremos mostrar un conjunto de cifras independientes de cualquier otra referencia. Su panel de campos es tan sencillo como el de la visualización tipo <a href="/powerbi/visual/card-tarjeta">tarjeta</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_01.jpg"></a>
La visualización solo tiene un campo que aceptará los campos o medidas de nuestro modelo de datos (pueden ser varios) de los que extraer un valor numérico:
<ul><li>Campo “<em>Campos</em>”: recibe los campos y medidas cuyos valores numéricos queremos representar.</li>
</ul>Por ejemplo, si llevamos a la visualización las medidas <em>Sales</em> y <em>Margin</em>, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_02.jpg"></a>
En el caso de tratarse de medidas, se calcularán y se mostrará el valor resultante. Si se trata de campos numéricos, se les aplicará una función de agregación que podemos escoger. En la siguiente imagen, por ejemplo, se ha llevado el campo <em>Units</em> de la tabla <em>Sales</em> que contiene el número de unidades implicadas en cada operación de venta. Puede verse que disponemos de varias funciones de agregación entre las que escoger:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_03.jpg"></a>
En esta visualización, el formato de los valores numéricos es automático y no puede personalizarse, lo que limita un poco su utilidad.
Podemos añadir texto al valor a mostrar creando una medida calculada como el resultado de la concatenación del texto que nos interese y de la fórmula cuyo resultado queramos mostrar. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización como cualquier otra. Véase el ejemplo incluido en la visualización <a href="/powerbi/visual/card-tarjeta">Tarjeta</a>.
Como se aprecia en la primera imagen mostrada, la visualización incluye una barra vertical a la izquierda de las cifras y etiquetas. Esta barra puede ocultarse o personalizarse (color y grosor). También podemos añadir un marco (pudiendo especificar los laterales en los que se muestra, su color y grosor). En la siguiente imagen se ha modificado la barra para mostrar un grosor de 4 (¿píxels?), color azul oscuro y un marco (llamado "esquema" en el panel de formato) en los cuatro laterales de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_04.jpg"></a>
Esta personalización se realiza en <em>Formato > Tarjeta</em>.
El "esquema" es independiente del borde que puede mostrarse alrededor de cualquier visualización en Power BI (la única ventaja del esquema es que podemos aplicarlo a los lados que deseemos, mientras que el borde se aplica a los cuatro laterales).
Adicionalmente podemos dar formato a las etiquetas de los datos (color, tamaño de fuente y familia) -ya se ha comentado que no se puede especificar el formato numérico-, y a las etiquetas de texto que se muestran debajo de los valores (nuevamente, color, tamaño de fuente y familia).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-3331b801-abac-4728-a6b1-d2b9655d1467') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tarjeta de varias filas</strong> o <strong>Multi-row card</strong> es de utilidad cuando queremos mostrar un conjunto de cifras independientes de cualquier otra referencia. Su panel de campos es tan sencillo como el de la visualización tipo <a href="/powerbi/visual/card-tarjeta">tarjeta</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_01.jpg"></a>
La visualización solo tiene un campo que aceptará los campos o medidas de nuestro modelo de datos (pueden ser varios) de los que extraer un valor numérico:
<ul><li>Campo “<em>Campos</em>”: recibe los campos y medidas cuyos valores numéricos queremos representar.</li>
</ul>Por ejemplo, si llevamos a la visualización las medidas <em>Sales</em> y <em>Margin</em>, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_02.jpg"></a>
En el caso de tratarse de medidas, se calcularán y se mostrará el valor resultante. Si se trata de campos numéricos, se les aplicará una función de agregación que podemos escoger. En la siguiente imagen, por ejemplo, se ha llevado el campo <em>Units</em> de la tabla <em>Sales</em> que contiene el número de unidades implicadas en cada operación de venta. Puede verse que disponemos de varias funciones de agregación entre las que escoger:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_03.jpg"></a>
En esta visualización, el formato de los valores numéricos es automático y no puede personalizarse, lo que limita un poco su utilidad.
Podemos añadir texto al valor a mostrar creando una medida calculada como el resultado de la concatenación del texto que nos interese y de la fórmula cuyo resultado queramos mostrar. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización como cualquier otra. Véase el ejemplo incluido en la visualización <a href="/powerbi/visual/card-tarjeta">Tarjeta</a>.
Como se aprecia en la primera imagen mostrada, la visualización incluye una barra vertical a la izquierda de las cifras y etiquetas. Esta barra puede ocultarse o personalizarse (color y grosor). También podemos añadir un marco (pudiendo especificar los laterales en los que se muestra, su color y grosor). En la siguiente imagen se ha modificado la barra para mostrar un grosor de 4 (¿píxels?), color azul oscuro y un marco (llamado "esquema" en el panel de formato) en los cuatro laterales de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_04.jpg"></a>
Esta personalización se realiza en <em>Formato > Tarjeta</em>.
El "esquema" es independiente del borde que puede mostrarse alrededor de cualquier visualización en Power BI (la única ventaja del esquema es que podemos aplicarlo a los lados que deseemos, mientras que el borde se aplica a los cuatro laterales).
Adicionalmente podemos dar formato a las etiquetas de los datos (color, tamaño de fuente y familia) -ya se ha comentado que no se puede especificar el formato numérico-, y a las etiquetas de texto que se muestran debajo de los valores (nuevamente, color, tamaño de fuente y familia).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-3331b801-abac-4728-a6b1-d2b9655d1467') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tarjeta de varias filas</strong> o <strong>Multi-row card</strong> es de utilidad cuando queremos mostrar un conjunto de cifras independientes de cualquier otra referencia. Su panel de campos es tan sencillo como el de la visualización tipo <a href="/powerbi/visual/card-tarjeta">tarjeta</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_01.jpg"></a>
La visualización solo tiene un campo que aceptará los campos o medidas de nuestro modelo de datos (pueden ser varios) de los que extraer un valor numérico:
<ul><li>Campo “<em>Campos</em>”: recibe los campos y medidas cuyos valores numéricos queremos representar.</li>
</ul>Por ejemplo, si llevamos a la visualización las medidas <em>Sales</em> y <em>Margin</em>, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_02.jpg"></a>
En el caso de tratarse de medidas, se calcularán y se mostrará el valor resultante. Si se trata de campos numéricos, se les aplicará una función de agregación que podemos escoger. En la siguiente imagen, por ejemplo, se ha llevado el campo <em>Units</em> de la tabla <em>Sales</em> que contiene el número de unidades implicadas en cada operación de venta. Puede verse que disponemos de varias funciones de agregación entre las que escoger:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_03.jpg"></a>
En esta visualización, el formato de los valores numéricos es automático y no puede personalizarse, lo que limita un poco su utilidad.
Podemos añadir texto al valor a mostrar creando una medida calculada como el resultado de la concatenación del texto que nos interese y de la fórmula cuyo resultado queramos mostrar. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización como cualquier otra. Véase el ejemplo incluido en la visualización <a href="/powerbi/visual/card-tarjeta">Tarjeta</a>.
Como se aprecia en la primera imagen mostrada, la visualización incluye una barra vertical a la izquierda de las cifras y etiquetas. Esta barra puede ocultarse o personalizarse (color y grosor). También podemos añadir un marco (pudiendo especificar los laterales en los que se muestra, su color y grosor). En la siguiente imagen se ha modificado la barra para mostrar un grosor de 4 (¿píxels?), color azul oscuro y un marco (llamado "esquema" en el panel de formato) en los cuatro laterales de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_04.jpg"></a>
Esta personalización se realiza en <em>Formato > Tarjeta</em>.
El "esquema" es independiente del borde que puede mostrarse alrededor de cualquier visualización en Power BI (la única ventaja del esquema es que podemos aplicarlo a los lados que deseemos, mientras que el borde se aplica a los cuatro laterales).
Adicionalmente podemos dar formato a las etiquetas de los datos (color, tamaño de fuente y familia) -ya se ha comentado que no se puede especificar el formato numérico-, y a las etiquetas de texto que se muestran debajo de los valores (nuevamente, color, tamaño de fuente y familia).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-3331b801-abac-4728-a6b1-d2b9655d1467') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tarjeta de varias filas</strong> o <strong>Multi-row card</strong> es de utilidad cuando queremos mostrar un conjunto de cifras independientes de cualquier otra referencia. Su panel de campos es tan sencillo como el de la visualización tipo <a href="/powerbi/visual/card-tarjeta">tarjeta</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_01.jpg"></a>
La visualización solo tiene un campo que aceptará los campos o medidas de nuestro modelo de datos (pueden ser varios) de los que extraer un valor numérico:
<ul><li>Campo “<em>Campos</em>”: recibe los campos y medidas cuyos valores numéricos queremos representar.</li>
</ul>Por ejemplo, si llevamos a la visualización las medidas <em>Sales</em> y <em>Margin</em>, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_02.jpg"></a>
En el caso de tratarse de medidas, se calcularán y se mostrará el valor resultante. Si se trata de campos numéricos, se les aplicará una función de agregación que podemos escoger. En la siguiente imagen, por ejemplo, se ha llevado el campo <em>Units</em> de la tabla <em>Sales</em> que contiene el número de unidades implicadas en cada operación de venta. Puede verse que disponemos de varias funciones de agregación entre las que escoger:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_03.jpg"></a>
En esta visualización, el formato de los valores numéricos es automático y no puede personalizarse, lo que limita un poco su utilidad.
Podemos añadir texto al valor a mostrar creando una medida calculada como el resultado de la concatenación del texto que nos interese y de la fórmula cuyo resultado queramos mostrar. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización como cualquier otra. Véase el ejemplo incluido en la visualización <a href="/powerbi/visual/card-tarjeta">Tarjeta</a>.
Como se aprecia en la primera imagen mostrada, la visualización incluye una barra vertical a la izquierda de las cifras y etiquetas. Esta barra puede ocultarse o personalizarse (color y grosor). También podemos añadir un marco (pudiendo especificar los laterales en los que se muestra, su color y grosor). En la siguiente imagen se ha modificado la barra para mostrar un grosor de 4 (¿píxels?), color azul oscuro y un marco (llamado "esquema" en el panel de formato) en los cuatro laterales de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_04.jpg"></a>
Esta personalización se realiza en <em>Formato > Tarjeta</em>.
El "esquema" es independiente del borde que puede mostrarse alrededor de cualquier visualización en Power BI (la única ventaja del esquema es que podemos aplicarlo a los lados que deseemos, mientras que el borde se aplica a los cuatro laterales).
Adicionalmente podemos dar formato a las etiquetas de los datos (color, tamaño de fuente y familia) -ya se ha comentado que no se puede especificar el formato numérico-, y a las etiquetas de texto que se muestran debajo de los valores (nuevamente, color, tamaño de fuente y familia).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-3331b801-abac-4728-a6b1-d2b9655d1467') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La <strong>tarjeta de varias filas</strong> o <strong>Multi-row card</strong> es de utilidad cuando queremos mostrar un conjunto de cifras independientes de cualquier otra referencia. Su panel de campos es tan sencillo como el de la visualización tipo <a href="/powerbi/visual/card-tarjeta">tarjeta</a>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_01.jpg"></a>
La visualización solo tiene un campo que aceptará los campos o medidas de nuestro modelo de datos (pueden ser varios) de los que extraer un valor numérico:
<ul><li>Campo “<em>Campos</em>”: recibe los campos y medidas cuyos valores numéricos queremos representar.</li>
</ul>Por ejemplo, si llevamos a la visualización las medidas <em>Sales</em> y <em>Margin</em>, el resultado es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_02.jpg"></a>
En el caso de tratarse de medidas, se calcularán y se mostrará el valor resultante. Si se trata de campos numéricos, se les aplicará una función de agregación que podemos escoger. En la siguiente imagen, por ejemplo, se ha llevado el campo <em>Units</em> de la tabla <em>Sales</em> que contiene el número de unidades implicadas en cada operación de venta. Puede verse que disponemos de varias funciones de agregación entre las que escoger:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_03.jpg"></a>
En esta visualización, el formato de los valores numéricos es automático y no puede personalizarse, lo que limita un poco su utilidad.
Podemos añadir texto al valor a mostrar creando una medida calculada como el resultado de la concatenación del texto que nos interese y de la fórmula cuyo resultado queramos mostrar. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización como cualquier otra. Véase el ejemplo incluido en la visualización <a href="/powerbi/visual/card-tarjeta">Tarjeta</a>.
Como se aprecia en la primera imagen mostrada, la visualización incluye una barra vertical a la izquierda de las cifras y etiquetas. Esta barra puede ocultarse o personalizarse (color y grosor). También podemos añadir un marco (pudiendo especificar los laterales en los que se muestra, su color y grosor). En la siguiente imagen se ha modificado la barra para mostrar un grosor de 4 (¿píxels?), color azul oscuro y un marco (llamado "esquema" en el panel de formato) en los cuatro laterales de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/multirowcard_04.jpg"></a>
Esta personalización se realiza en <em>Formato > Tarjeta</em>.
El "esquema" es independiente del borde que puede mostrarse alrededor de cualquier visualización en Power BI (la única ventaja del esquema es que podemos aplicarlo a los lados que deseemos, mientras que el borde se aplica a los cuatro laterales).
Adicionalmente podemos dar formato a las etiquetas de los datos (color, tamaño de fuente y familia) -ya se ha comentado que no se puede especificar el formato numérico-, y a las etiquetas de texto que se muestran debajo de los valores (nuevamente, color, tamaño de fuente y familia).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-34184b1a-5cea-43dc-8441-a3ba1559bc3a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La tarjeta es de utilidad cuando queremos mostrar una cifra independiente de cualquier otra referencia, lo que frecuentemente resulta más impactante y fácil de interpretar que otras gráficas más sofisticadas. Su panel de campos es extremadamente sencillo, admitiendo un único campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_01.jpg"></a>
Si llevamos a este campo una medida, se calculará y se mostrará en la visualización. Si llevamos un campo (numérico), podremos escoger la función de agregación a aplicar. Por ejemplo, si llevamos el campo <em>Number of Children</em> de nuestro modelo de datos (campo que contiene el número de hijos de nuestros clientes), podemos escoger entre las siguientes funciones de agregación:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_02.jpg"></a>
Si escogemos, por ejemplo, el promedio, la visualización mostrará el número medio de hijos de los clientes involucrados en el contexto actual (todos, por defecto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_03.jpg"></a>
El formato del valor numérico es, por defecto, automático. Así, si el valor de ventas que se está mostrando alcanza la cifra $4.500.000.000, se mostrará 5 mil M €. En todo caso, es posible personalizar este formato en el área de formato de la visualización (<em>Formato > Etiqueta de datos > Mostrar unidades</em>).
Es posible dar formato a la etiqueta que representa la cifra (<em>Formato > Etiqueta de datos</em>): color, formato numérico, familia de fuente... así como mostrar u ocultar el texto que se muestra bajo ésta (y modificar su formato: color, tamaño y familia de la fuente). No se puede, sin embargo, modificar dicho texto (por ejemplo, no podríamos cambiarlo por algo como "Número medio de hijos"). Lo que sí podemos hacer es añadir un texto al valor a mostrar creando una medida calculada como el resultado de la concatenación de ambos valores, el texto que nos interese y el valor numérico involucrado. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización. Así, si estamos mostrando información de la medida <em>Sales</em>, podemos crear la siguiente medida basada en ella:
Ventas = CONCATENATE("Ventas totales: "; [Sales])
Y arrastrar esta medida hasta el campo “<em>Campos</em>” de la visualización. Desafortunadamente perdemos de esta forma la opción de dar formato al número (pues se trata como texto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_04.jpg"></a>
Podemos modificar dicho formato si recurrimos a la función <a href="/dax/function/format">FORMAT</a> de DAX, por ejemplo:
Ventas = CONCATENATE("Ventas totales: " & UNICHAR(10); FORMAT([Sales]; "Currency"))
(se ha añadido la función <a href="/dax/function/unichar">UNICHAR</a> para forzar un salto de línea entre el texto y el valor numérico):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_05.jpg"></a>
En el ejemplo anterior se ha ocultado la etiqueta de categoría (<em>Formato > Etiqueta de categoría)</em>.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-34184b1a-5cea-43dc-8441-a3ba1559bc3a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La tarjeta es de utilidad cuando queremos mostrar una cifra independiente de cualquier otra referencia, lo que frecuentemente resulta más impactante y fácil de interpretar que otras gráficas más sofisticadas. Su panel de campos es extremadamente sencillo, admitiendo un único campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_01.jpg"></a>
Si llevamos a este campo una medida, se calculará y se mostrará en la visualización. Si llevamos un campo (numérico), podremos escoger la función de agregación a aplicar. Por ejemplo, si llevamos el campo <em>Number of Children</em> de nuestro modelo de datos (campo que contiene el número de hijos de nuestros clientes), podemos escoger entre las siguientes funciones de agregación:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_02.jpg"></a>
Si escogemos, por ejemplo, el promedio, la visualización mostrará el número medio de hijos de los clientes involucrados en el contexto actual (todos, por defecto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_03.jpg"></a>
El formato del valor numérico es, por defecto, automático. Así, si el valor de ventas que se está mostrando alcanza la cifra $4.500.000.000, se mostrará 5 mil M €. En todo caso, es posible personalizar este formato en el área de formato de la visualización (<em>Formato > Etiqueta de datos > Mostrar unidades</em>).
Es posible dar formato a la etiqueta que representa la cifra (<em>Formato > Etiqueta de datos</em>): color, formato numérico, familia de fuente... así como mostrar u ocultar el texto que se muestra bajo ésta (y modificar su formato: color, tamaño y familia de la fuente). No se puede, sin embargo, modificar dicho texto (por ejemplo, no podríamos cambiarlo por algo como "Número medio de hijos"). Lo que sí podemos hacer es añadir un texto al valor a mostrar creando una medida calculada como el resultado de la concatenación de ambos valores, el texto que nos interese y el valor numérico involucrado. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización. Así, si estamos mostrando información de la medida <em>Sales</em>, podemos crear la siguiente medida basada en ella:
Ventas = CONCATENATE("Ventas totales: "; [Sales])
Y arrastrar esta medida hasta el campo “<em>Campos</em>” de la visualización. Desafortunadamente perdemos de esta forma la opción de dar formato al número (pues se trata como texto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_04.jpg"></a>
Podemos modificar dicho formato si recurrimos a la función <a href="/dax/function/format">FORMAT</a> de DAX, por ejemplo:
Ventas = CONCATENATE("Ventas totales: " & UNICHAR(10); FORMAT([Sales]; "Currency"))
(se ha añadido la función <a href="/dax/function/unichar">UNICHAR</a> para forzar un salto de línea entre el texto y el valor numérico):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_05.jpg"></a>
En el ejemplo anterior se ha ocultado la etiqueta de categoría (<em>Formato > Etiqueta de categoría)</em>.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-34184b1a-5cea-43dc-8441-a3ba1559bc3a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La tarjeta es de utilidad cuando queremos mostrar una cifra independiente de cualquier otra referencia, lo que frecuentemente resulta más impactante y fácil de interpretar que otras gráficas más sofisticadas. Su panel de campos es extremadamente sencillo, admitiendo un único campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_01.jpg"></a>
Si llevamos a este campo una medida, se calculará y se mostrará en la visualización. Si llevamos un campo (numérico), podremos escoger la función de agregación a aplicar. Por ejemplo, si llevamos el campo <em>Number of Children</em> de nuestro modelo de datos (campo que contiene el número de hijos de nuestros clientes), podemos escoger entre las siguientes funciones de agregación:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_02.jpg"></a>
Si escogemos, por ejemplo, el promedio, la visualización mostrará el número medio de hijos de los clientes involucrados en el contexto actual (todos, por defecto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_03.jpg"></a>
El formato del valor numérico es, por defecto, automático. Así, si el valor de ventas que se está mostrando alcanza la cifra $4.500.000.000, se mostrará 5 mil M €. En todo caso, es posible personalizar este formato en el área de formato de la visualización (<em>Formato > Etiqueta de datos > Mostrar unidades</em>).
Es posible dar formato a la etiqueta que representa la cifra (<em>Formato > Etiqueta de datos</em>): color, formato numérico, familia de fuente... así como mostrar u ocultar el texto que se muestra bajo ésta (y modificar su formato: color, tamaño y familia de la fuente). No se puede, sin embargo, modificar dicho texto (por ejemplo, no podríamos cambiarlo por algo como "Número medio de hijos"). Lo que sí podemos hacer es añadir un texto al valor a mostrar creando una medida calculada como el resultado de la concatenación de ambos valores, el texto que nos interese y el valor numérico involucrado. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización. Así, si estamos mostrando información de la medida <em>Sales</em>, podemos crear la siguiente medida basada en ella:
Ventas = CONCATENATE("Ventas totales: "; [Sales])
Y arrastrar esta medida hasta el campo “<em>Campos</em>” de la visualización. Desafortunadamente perdemos de esta forma la opción de dar formato al número (pues se trata como texto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_04.jpg"></a>
Podemos modificar dicho formato si recurrimos a la función <a href="/dax/function/format">FORMAT</a> de DAX, por ejemplo:
Ventas = CONCATENATE("Ventas totales: " & UNICHAR(10); FORMAT([Sales]; "Currency"))
(se ha añadido la función <a href="/dax/function/unichar">UNICHAR</a> para forzar un salto de línea entre el texto y el valor numérico):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_05.jpg"></a>
En el ejemplo anterior se ha ocultado la etiqueta de categoría (<em>Formato > Etiqueta de categoría)</em>.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-34184b1a-5cea-43dc-8441-a3ba1559bc3a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La tarjeta es de utilidad cuando queremos mostrar una cifra independiente de cualquier otra referencia, lo que frecuentemente resulta más impactante y fácil de interpretar que otras gráficas más sofisticadas. Su panel de campos es extremadamente sencillo, admitiendo un único campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_01.jpg"></a>
Si llevamos a este campo una medida, se calculará y se mostrará en la visualización. Si llevamos un campo (numérico), podremos escoger la función de agregación a aplicar. Por ejemplo, si llevamos el campo <em>Number of Children</em> de nuestro modelo de datos (campo que contiene el número de hijos de nuestros clientes), podemos escoger entre las siguientes funciones de agregación:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_02.jpg"></a>
Si escogemos, por ejemplo, el promedio, la visualización mostrará el número medio de hijos de los clientes involucrados en el contexto actual (todos, por defecto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_03.jpg"></a>
El formato del valor numérico es, por defecto, automático. Así, si el valor de ventas que se está mostrando alcanza la cifra $4.500.000.000, se mostrará 5 mil M €. En todo caso, es posible personalizar este formato en el área de formato de la visualización (<em>Formato > Etiqueta de datos > Mostrar unidades</em>).
Es posible dar formato a la etiqueta que representa la cifra (<em>Formato > Etiqueta de datos</em>): color, formato numérico, familia de fuente... así como mostrar u ocultar el texto que se muestra bajo ésta (y modificar su formato: color, tamaño y familia de la fuente). No se puede, sin embargo, modificar dicho texto (por ejemplo, no podríamos cambiarlo por algo como "Número medio de hijos"). Lo que sí podemos hacer es añadir un texto al valor a mostrar creando una medida calculada como el resultado de la concatenación de ambos valores, el texto que nos interese y el valor numérico involucrado. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización. Así, si estamos mostrando información de la medida <em>Sales</em>, podemos crear la siguiente medida basada en ella:
Ventas = CONCATENATE("Ventas totales: "; [Sales])
Y arrastrar esta medida hasta el campo “<em>Campos</em>” de la visualización. Desafortunadamente perdemos de esta forma la opción de dar formato al número (pues se trata como texto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_04.jpg"></a>
Podemos modificar dicho formato si recurrimos a la función <a href="/dax/function/format">FORMAT</a> de DAX, por ejemplo:
Ventas = CONCATENATE("Ventas totales: " & UNICHAR(10); FORMAT([Sales]; "Currency"))
(se ha añadido la función <a href="/dax/function/unichar">UNICHAR</a> para forzar un salto de línea entre el texto y el valor numérico):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_05.jpg"></a>
En el ejemplo anterior se ha ocultado la etiqueta de categoría (<em>Formato > Etiqueta de categoría)</em>.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-227db5d4-ed64-4247-82cf-89df09d317c7') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La tarjeta es de utilidad cuando queremos mostrar una cifra independiente de cualquier otra referencia, lo que frecuentemente resulta más impactante y fácil de interpretar que otras gráficas más sofisticadas. Su panel de campos es extremadamente sencillo, admitiendo un único campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_01.jpg"></a>
Si llevamos a este campo una medida, se calculará y se mostrará en la visualización. Si llevamos un campo (numérico), podremos escoger la función de agregación a aplicar. Por ejemplo, si llevamos el campo <em>Number of Children</em> de nuestro modelo de datos (campo que contiene el número de hijos de nuestros clientes), podemos escoger entre las siguientes funciones de agregación:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_02.jpg"></a>
Si escogemos, por ejemplo, el promedio, la visualización mostrará el número medio de hijos de los clientes involucrados en el contexto actual (todos, por defecto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_03.jpg"></a>
El formato del valor numérico es, por defecto, automático. Así, si el valor de ventas que se está mostrando alcanza la cifra $4.500.000.000, se mostrará 5 mil M €. En todo caso, es posible personalizar este formato en el área de formato de la visualización (<em>Formato > Etiqueta de datos > Mostrar unidades</em>).
Es posible dar formato a la etiqueta que representa la cifra (<em>Formato > Etiqueta de datos</em>): color, formato numérico, familia de fuente... así como mostrar u ocultar el texto que se muestra bajo ésta (y modificar su formato: color, tamaño y familia de la fuente). No se puede, sin embargo, modificar dicho texto (por ejemplo, no podríamos cambiarlo por algo como "Número medio de hijos"). Lo que sí podemos hacer es añadir un texto al valor a mostrar creando una medida calculada como el resultado de la concatenación de ambos valores, el texto que nos interese y el valor numérico involucrado. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización. Así, si estamos mostrando información de la medida <em>Sales</em>, podemos crear la siguiente medida basada en ella:
Ventas = CONCATENATE("Ventas totales: "; [Sales])
Y arrastrar esta medida hasta el campo “<em>Campos</em>” de la visualización. Desafortunadamente perdemos de esta forma la opción de dar formato al número (pues se trata como texto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_04.jpg"></a>
Podemos modificar dicho formato si recurrimos a la función <a href="/dax/function/format">FORMAT</a> de DAX, por ejemplo:
Ventas = CONCATENATE("Ventas totales: " & UNICHAR(10); FORMAT([Sales]; "Currency"))
(se ha añadido la función <a href="/dax/function/unichar">UNICHAR</a> para forzar un salto de línea entre el texto y el valor numérico):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_05.jpg"></a>
En el ejemplo anterior se ha ocultado la etiqueta de categoría (<em>Formato > Etiqueta de categoría)</em>.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-227db5d4-ed64-4247-82cf-89df09d317c7') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La tarjeta es de utilidad cuando queremos mostrar una cifra independiente de cualquier otra referencia, lo que frecuentemente resulta más impactante y fácil de interpretar que otras gráficas más sofisticadas. Su panel de campos es extremadamente sencillo, admitiendo un único campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_01.jpg"></a>
Si llevamos a este campo una medida, se calculará y se mostrará en la visualización. Si llevamos un campo (numérico), podremos escoger la función de agregación a aplicar. Por ejemplo, si llevamos el campo <em>Number of Children</em> de nuestro modelo de datos (campo que contiene el número de hijos de nuestros clientes), podemos escoger entre las siguientes funciones de agregación:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_02.jpg"></a>
Si escogemos, por ejemplo, el promedio, la visualización mostrará el número medio de hijos de los clientes involucrados en el contexto actual (todos, por defecto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_03.jpg"></a>
El formato del valor numérico es, por defecto, automático. Así, si el valor de ventas que se está mostrando alcanza la cifra $4.500.000.000, se mostrará 5 mil M €. En todo caso, es posible personalizar este formato en el área de formato de la visualización (<em>Formato > Etiqueta de datos > Mostrar unidades</em>).
Es posible dar formato a la etiqueta que representa la cifra (<em>Formato > Etiqueta de datos</em>): color, formato numérico, familia de fuente... así como mostrar u ocultar el texto que se muestra bajo ésta (y modificar su formato: color, tamaño y familia de la fuente). No se puede, sin embargo, modificar dicho texto (por ejemplo, no podríamos cambiarlo por algo como "Número medio de hijos"). Lo que sí podemos hacer es añadir un texto al valor a mostrar creando una medida calculada como el resultado de la concatenación de ambos valores, el texto que nos interese y el valor numérico involucrado. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización. Así, si estamos mostrando información de la medida <em>Sales</em>, podemos crear la siguiente medida basada en ella:
Ventas = CONCATENATE("Ventas totales: "; [Sales])
Y arrastrar esta medida hasta el campo “<em>Campos</em>” de la visualización. Desafortunadamente perdemos de esta forma la opción de dar formato al número (pues se trata como texto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_04.jpg"></a>
Podemos modificar dicho formato si recurrimos a la función <a href="/dax/function/format">FORMAT</a> de DAX, por ejemplo:
Ventas = CONCATENATE("Ventas totales: " & UNICHAR(10); FORMAT([Sales]; "Currency"))
(se ha añadido la función <a href="/dax/function/unichar">UNICHAR</a> para forzar un salto de línea entre el texto y el valor numérico):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_05.jpg"></a>
En el ejemplo anterior se ha ocultado la etiqueta de categoría (<em>Formato > Etiqueta de categoría)</em>.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-227db5d4-ed64-4247-82cf-89df09d317c7') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La tarjeta es de utilidad cuando queremos mostrar una cifra independiente de cualquier otra referencia, lo que frecuentemente resulta más impactante y fácil de interpretar que otras gráficas más sofisticadas. Su panel de campos es extremadamente sencillo, admitiendo un único campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_01.jpg"></a>
Si llevamos a este campo una medida, se calculará y se mostrará en la visualización. Si llevamos un campo (numérico), podremos escoger la función de agregación a aplicar. Por ejemplo, si llevamos el campo <em>Number of Children</em> de nuestro modelo de datos (campo que contiene el número de hijos de nuestros clientes), podemos escoger entre las siguientes funciones de agregación:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_02.jpg"></a>
Si escogemos, por ejemplo, el promedio, la visualización mostrará el número medio de hijos de los clientes involucrados en el contexto actual (todos, por defecto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_03.jpg"></a>
El formato del valor numérico es, por defecto, automático. Así, si el valor de ventas que se está mostrando alcanza la cifra $4.500.000.000, se mostrará 5 mil M €. En todo caso, es posible personalizar este formato en el área de formato de la visualización (<em>Formato > Etiqueta de datos > Mostrar unidades</em>).
Es posible dar formato a la etiqueta que representa la cifra (<em>Formato > Etiqueta de datos</em>): color, formato numérico, familia de fuente... así como mostrar u ocultar el texto que se muestra bajo ésta (y modificar su formato: color, tamaño y familia de la fuente). No se puede, sin embargo, modificar dicho texto (por ejemplo, no podríamos cambiarlo por algo como "Número medio de hijos"). Lo que sí podemos hacer es añadir un texto al valor a mostrar creando una medida calculada como el resultado de la concatenación de ambos valores, el texto que nos interese y el valor numérico involucrado. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización. Así, si estamos mostrando información de la medida <em>Sales</em>, podemos crear la siguiente medida basada en ella:
Ventas = CONCATENATE("Ventas totales: "; [Sales])
Y arrastrar esta medida hasta el campo “<em>Campos</em>” de la visualización. Desafortunadamente perdemos de esta forma la opción de dar formato al número (pues se trata como texto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_04.jpg"></a>
Podemos modificar dicho formato si recurrimos a la función <a href="/dax/function/format">FORMAT</a> de DAX, por ejemplo:
Ventas = CONCATENATE("Ventas totales: " & UNICHAR(10); FORMAT([Sales]; "Currency"))
(se ha añadido la función <a href="/dax/function/unichar">UNICHAR</a> para forzar un salto de línea entre el texto y el valor numérico):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_05.jpg"></a>
En el ejemplo anterior se ha ocultado la etiqueta de categoría (<em>Formato > Etiqueta de categoría)</em>.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-227db5d4-ed64-4247-82cf-89df09d317c7') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La tarjeta es de utilidad cuando queremos mostrar una cifra independiente de cualquier otra referencia, lo que frecuentemente resulta más impactante y fácil de interpretar que otras gráficas más sofisticadas. Su panel de campos es extremadamente sencillo, admitiendo un único campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_01.jpg"></a>
Si llevamos a este campo una medida, se calculará y se mostrará en la visualización. Si llevamos un campo (numérico), podremos escoger la función de agregación a aplicar. Por ejemplo, si llevamos el campo <em>Number of Children</em> de nuestro modelo de datos (campo que contiene el número de hijos de nuestros clientes), podemos escoger entre las siguientes funciones de agregación:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_02.jpg"></a>
Si escogemos, por ejemplo, el promedio, la visualización mostrará el número medio de hijos de los clientes involucrados en el contexto actual (todos, por defecto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_03.jpg"></a>
El formato del valor numérico es, por defecto, automático. Así, si el valor de ventas que se está mostrando alcanza la cifra $4.500.000.000, se mostrará 5 mil M €. En todo caso, es posible personalizar este formato en el área de formato de la visualización (<em>Formato > Etiqueta de datos > Mostrar unidades</em>).
Es posible dar formato a la etiqueta que representa la cifra (<em>Formato > Etiqueta de datos</em>): color, formato numérico, familia de fuente... así como mostrar u ocultar el texto que se muestra bajo ésta (y modificar su formato: color, tamaño y familia de la fuente). No se puede, sin embargo, modificar dicho texto (por ejemplo, no podríamos cambiarlo por algo como "Número medio de hijos"). Lo que sí podemos hacer es añadir un texto al valor a mostrar creando una medida calculada como el resultado de la concatenación de ambos valores, el texto que nos interese y el valor numérico involucrado. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización. Así, si estamos mostrando información de la medida <em>Sales</em>, podemos crear la siguiente medida basada en ella:
Ventas = CONCATENATE("Ventas totales: "; [Sales])
Y arrastrar esta medida hasta el campo “<em>Campos</em>” de la visualización. Desafortunadamente perdemos de esta forma la opción de dar formato al número (pues se trata como texto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_04.jpg"></a>
Podemos modificar dicho formato si recurrimos a la función <a href="/dax/function/format">FORMAT</a> de DAX, por ejemplo:
Ventas = CONCATENATE("Ventas totales: " & UNICHAR(10); FORMAT([Sales]; "Currency"))
(se ha añadido la función <a href="/dax/function/unichar">UNICHAR</a> para forzar un salto de línea entre el texto y el valor numérico):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_05.jpg"></a>
En el ejemplo anterior se ha ocultado la etiqueta de categoría (<em>Formato > Etiqueta de categoría)</em>.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-f2c966f8-dcda-4882-b5af-34dbe46cbbd3') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La tarjeta es de utilidad cuando queremos mostrar una cifra independiente de cualquier otra referencia, lo que frecuentemente resulta más impactante y fácil de interpretar que otras gráficas más sofisticadas. Su panel de campos es extremadamente sencillo, admitiendo un único campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_01.jpg"></a>
Si llevamos a este campo una medida, se calculará y se mostrará en la visualización. Si llevamos un campo (numérico), podremos escoger la función de agregación a aplicar. Por ejemplo, si llevamos el campo <em>Number of Children</em> de nuestro modelo de datos (campo que contiene el número de hijos de nuestros clientes), podemos escoger entre las siguientes funciones de agregación:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_02.jpg"></a>
Si escogemos, por ejemplo, el promedio, la visualización mostrará el número medio de hijos de los clientes involucrados en el contexto actual (todos, por defecto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_03.jpg"></a>
El formato del valor numérico es, por defecto, automático. Así, si el valor de ventas que se está mostrando alcanza la cifra $4.500.000.000, se mostrará 5 mil M €. En todo caso, es posible personalizar este formato en el área de formato de la visualización (<em>Formato > Etiqueta de datos > Mostrar unidades</em>).
Es posible dar formato a la etiqueta que representa la cifra (<em>Formato > Etiqueta de datos</em>): color, formato numérico, familia de fuente... así como mostrar u ocultar el texto que se muestra bajo ésta (y modificar su formato: color, tamaño y familia de la fuente). No se puede, sin embargo, modificar dicho texto (por ejemplo, no podríamos cambiarlo por algo como "Número medio de hijos"). Lo que sí podemos hacer es añadir un texto al valor a mostrar creando una medida calculada como el resultado de la concatenación de ambos valores, el texto que nos interese y el valor numérico involucrado. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización. Así, si estamos mostrando información de la medida <em>Sales</em>, podemos crear la siguiente medida basada en ella:
Ventas = CONCATENATE("Ventas totales: "; [Sales])
Y arrastrar esta medida hasta el campo “<em>Campos</em>” de la visualización. Desafortunadamente perdemos de esta forma la opción de dar formato al número (pues se trata como texto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_04.jpg"></a>
Podemos modificar dicho formato si recurrimos a la función <a href="/dax/function/format">FORMAT</a> de DAX, por ejemplo:
Ventas = CONCATENATE("Ventas totales: " & UNICHAR(10); FORMAT([Sales]; "Currency"))
(se ha añadido la función <a href="/dax/function/unichar">UNICHAR</a> para forzar un salto de línea entre el texto y el valor numérico):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_05.jpg"></a>
En el ejemplo anterior se ha ocultado la etiqueta de categoría (<em>Formato > Etiqueta de categoría)</em>.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-f2c966f8-dcda-4882-b5af-34dbe46cbbd3') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La tarjeta es de utilidad cuando queremos mostrar una cifra independiente de cualquier otra referencia, lo que frecuentemente resulta más impactante y fácil de interpretar que otras gráficas más sofisticadas. Su panel de campos es extremadamente sencillo, admitiendo un único campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_01.jpg"></a>
Si llevamos a este campo una medida, se calculará y se mostrará en la visualización. Si llevamos un campo (numérico), podremos escoger la función de agregación a aplicar. Por ejemplo, si llevamos el campo <em>Number of Children</em> de nuestro modelo de datos (campo que contiene el número de hijos de nuestros clientes), podemos escoger entre las siguientes funciones de agregación:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_02.jpg"></a>
Si escogemos, por ejemplo, el promedio, la visualización mostrará el número medio de hijos de los clientes involucrados en el contexto actual (todos, por defecto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_03.jpg"></a>
El formato del valor numérico es, por defecto, automático. Así, si el valor de ventas que se está mostrando alcanza la cifra $4.500.000.000, se mostrará 5 mil M €. En todo caso, es posible personalizar este formato en el área de formato de la visualización (<em>Formato > Etiqueta de datos > Mostrar unidades</em>).
Es posible dar formato a la etiqueta que representa la cifra (<em>Formato > Etiqueta de datos</em>): color, formato numérico, familia de fuente... así como mostrar u ocultar el texto que se muestra bajo ésta (y modificar su formato: color, tamaño y familia de la fuente). No se puede, sin embargo, modificar dicho texto (por ejemplo, no podríamos cambiarlo por algo como "Número medio de hijos"). Lo que sí podemos hacer es añadir un texto al valor a mostrar creando una medida calculada como el resultado de la concatenación de ambos valores, el texto que nos interese y el valor numérico involucrado. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización. Así, si estamos mostrando información de la medida <em>Sales</em>, podemos crear la siguiente medida basada en ella:
Ventas = CONCATENATE("Ventas totales: "; [Sales])
Y arrastrar esta medida hasta el campo “<em>Campos</em>” de la visualización. Desafortunadamente perdemos de esta forma la opción de dar formato al número (pues se trata como texto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_04.jpg"></a>
Podemos modificar dicho formato si recurrimos a la función <a href="/dax/function/format">FORMAT</a> de DAX, por ejemplo:
Ventas = CONCATENATE("Ventas totales: " & UNICHAR(10); FORMAT([Sales]; "Currency"))
(se ha añadido la función <a href="/dax/function/unichar">UNICHAR</a> para forzar un salto de línea entre el texto y el valor numérico):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_05.jpg"></a>
En el ejemplo anterior se ha ocultado la etiqueta de categoría (<em>Formato > Etiqueta de categoría)</em>.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-f2c966f8-dcda-4882-b5af-34dbe46cbbd3') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La tarjeta es de utilidad cuando queremos mostrar una cifra independiente de cualquier otra referencia, lo que frecuentemente resulta más impactante y fácil de interpretar que otras gráficas más sofisticadas. Su panel de campos es extremadamente sencillo, admitiendo un único campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_01.jpg"></a>
Si llevamos a este campo una medida, se calculará y se mostrará en la visualización. Si llevamos un campo (numérico), podremos escoger la función de agregación a aplicar. Por ejemplo, si llevamos el campo <em>Number of Children</em> de nuestro modelo de datos (campo que contiene el número de hijos de nuestros clientes), podemos escoger entre las siguientes funciones de agregación:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_02.jpg"></a>
Si escogemos, por ejemplo, el promedio, la visualización mostrará el número medio de hijos de los clientes involucrados en el contexto actual (todos, por defecto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_03.jpg"></a>
El formato del valor numérico es, por defecto, automático. Así, si el valor de ventas que se está mostrando alcanza la cifra $4.500.000.000, se mostrará 5 mil M €. En todo caso, es posible personalizar este formato en el área de formato de la visualización (<em>Formato > Etiqueta de datos > Mostrar unidades</em>).
Es posible dar formato a la etiqueta que representa la cifra (<em>Formato > Etiqueta de datos</em>): color, formato numérico, familia de fuente... así como mostrar u ocultar el texto que se muestra bajo ésta (y modificar su formato: color, tamaño y familia de la fuente). No se puede, sin embargo, modificar dicho texto (por ejemplo, no podríamos cambiarlo por algo como "Número medio de hijos"). Lo que sí podemos hacer es añadir un texto al valor a mostrar creando una medida calculada como el resultado de la concatenación de ambos valores, el texto que nos interese y el valor numérico involucrado. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización. Así, si estamos mostrando información de la medida <em>Sales</em>, podemos crear la siguiente medida basada en ella:
Ventas = CONCATENATE("Ventas totales: "; [Sales])
Y arrastrar esta medida hasta el campo “<em>Campos</em>” de la visualización. Desafortunadamente perdemos de esta forma la opción de dar formato al número (pues se trata como texto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_04.jpg"></a>
Podemos modificar dicho formato si recurrimos a la función <a href="/dax/function/format">FORMAT</a> de DAX, por ejemplo:
Ventas = CONCATENATE("Ventas totales: " & UNICHAR(10); FORMAT([Sales]; "Currency"))
(se ha añadido la función <a href="/dax/function/unichar">UNICHAR</a> para forzar un salto de línea entre el texto y el valor numérico):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_05.jpg"></a>
En el ejemplo anterior se ha ocultado la etiqueta de categoría (<em>Formato > Etiqueta de categoría)</em>.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-f2c966f8-dcda-4882-b5af-34dbe46cbbd3') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La tarjeta es de utilidad cuando queremos mostrar una cifra independiente de cualquier otra referencia, lo que frecuentemente resulta más impactante y fácil de interpretar que otras gráficas más sofisticadas. Su panel de campos es extremadamente sencillo, admitiendo un único campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_01.jpg"></a>
Si llevamos a este campo una medida, se calculará y se mostrará en la visualización. Si llevamos un campo (numérico), podremos escoger la función de agregación a aplicar. Por ejemplo, si llevamos el campo <em>Number of Children</em> de nuestro modelo de datos (campo que contiene el número de hijos de nuestros clientes), podemos escoger entre las siguientes funciones de agregación:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_02.jpg"></a>
Si escogemos, por ejemplo, el promedio, la visualización mostrará el número medio de hijos de los clientes involucrados en el contexto actual (todos, por defecto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_03.jpg"></a>
El formato del valor numérico es, por defecto, automático. Así, si el valor de ventas que se está mostrando alcanza la cifra $4.500.000.000, se mostrará 5 mil M €. En todo caso, es posible personalizar este formato en el área de formato de la visualización (<em>Formato > Etiqueta de datos > Mostrar unidades</em>).
Es posible dar formato a la etiqueta que representa la cifra (<em>Formato > Etiqueta de datos</em>): color, formato numérico, familia de fuente... así como mostrar u ocultar el texto que se muestra bajo ésta (y modificar su formato: color, tamaño y familia de la fuente). No se puede, sin embargo, modificar dicho texto (por ejemplo, no podríamos cambiarlo por algo como "Número medio de hijos"). Lo que sí podemos hacer es añadir un texto al valor a mostrar creando una medida calculada como el resultado de la concatenación de ambos valores, el texto que nos interese y el valor numérico involucrado. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización. Así, si estamos mostrando información de la medida <em>Sales</em>, podemos crear la siguiente medida basada en ella:
Ventas = CONCATENATE("Ventas totales: "; [Sales])
Y arrastrar esta medida hasta el campo “<em>Campos</em>” de la visualización. Desafortunadamente perdemos de esta forma la opción de dar formato al número (pues se trata como texto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_04.jpg"></a>
Podemos modificar dicho formato si recurrimos a la función <a href="/dax/function/format">FORMAT</a> de DAX, por ejemplo:
Ventas = CONCATENATE("Ventas totales: " & UNICHAR(10); FORMAT([Sales]; "Currency"))
(se ha añadido la función <a href="/dax/function/unichar">UNICHAR</a> para forzar un salto de línea entre el texto y el valor numérico):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_05.jpg"></a>
En el ejemplo anterior se ha ocultado la etiqueta de categoría (<em>Formato > Etiqueta de categoría)</em>.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-91d0be46-804a-4700-8b40-8d32b6ee5611') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La tarjeta es de utilidad cuando queremos mostrar una cifra independiente de cualquier otra referencia, lo que frecuentemente resulta más impactante y fácil de interpretar que otras gráficas más sofisticadas. Su panel de campos es extremadamente sencillo, admitiendo un único campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_01.jpg"></a>
Si llevamos a este campo una medida, se calculará y se mostrará en la visualización. Si llevamos un campo (numérico), podremos escoger la función de agregación a aplicar. Por ejemplo, si llevamos el campo <em>Number of Children</em> de nuestro modelo de datos (campo que contiene el número de hijos de nuestros clientes), podemos escoger entre las siguientes funciones de agregación:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_02.jpg"></a>
Si escogemos, por ejemplo, el promedio, la visualización mostrará el número medio de hijos de los clientes involucrados en el contexto actual (todos, por defecto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_03.jpg"></a>
El formato del valor numérico es, por defecto, automático. Así, si el valor de ventas que se está mostrando alcanza la cifra $4.500.000.000, se mostrará 5 mil M €. En todo caso, es posible personalizar este formato en el área de formato de la visualización (<em>Formato > Etiqueta de datos > Mostrar unidades</em>).
Es posible dar formato a la etiqueta que representa la cifra (<em>Formato > Etiqueta de datos</em>): color, formato numérico, familia de fuente... así como mostrar u ocultar el texto que se muestra bajo ésta (y modificar su formato: color, tamaño y familia de la fuente). No se puede, sin embargo, modificar dicho texto (por ejemplo, no podríamos cambiarlo por algo como "Número medio de hijos"). Lo que sí podemos hacer es añadir un texto al valor a mostrar creando una medida calculada como el resultado de la concatenación de ambos valores, el texto que nos interese y el valor numérico involucrado. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización. Así, si estamos mostrando información de la medida <em>Sales</em>, podemos crear la siguiente medida basada en ella:
Ventas = CONCATENATE("Ventas totales: "; [Sales])
Y arrastrar esta medida hasta el campo “<em>Campos</em>” de la visualización. Desafortunadamente perdemos de esta forma la opción de dar formato al número (pues se trata como texto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_04.jpg"></a>
Podemos modificar dicho formato si recurrimos a la función <a href="/dax/function/format">FORMAT</a> de DAX, por ejemplo:
Ventas = CONCATENATE("Ventas totales: " & UNICHAR(10); FORMAT([Sales]; "Currency"))
(se ha añadido la función <a href="/dax/function/unichar">UNICHAR</a> para forzar un salto de línea entre el texto y el valor numérico):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_05.jpg"></a>
En el ejemplo anterior se ha ocultado la etiqueta de categoría (<em>Formato > Etiqueta de categoría)</em>.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-91d0be46-804a-4700-8b40-8d32b6ee5611') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La tarjeta es de utilidad cuando queremos mostrar una cifra independiente de cualquier otra referencia, lo que frecuentemente resulta más impactante y fácil de interpretar que otras gráficas más sofisticadas. Su panel de campos es extremadamente sencillo, admitiendo un único campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_01.jpg"></a>
Si llevamos a este campo una medida, se calculará y se mostrará en la visualización. Si llevamos un campo (numérico), podremos escoger la función de agregación a aplicar. Por ejemplo, si llevamos el campo <em>Number of Children</em> de nuestro modelo de datos (campo que contiene el número de hijos de nuestros clientes), podemos escoger entre las siguientes funciones de agregación:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_02.jpg"></a>
Si escogemos, por ejemplo, el promedio, la visualización mostrará el número medio de hijos de los clientes involucrados en el contexto actual (todos, por defecto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_03.jpg"></a>
El formato del valor numérico es, por defecto, automático. Así, si el valor de ventas que se está mostrando alcanza la cifra $4.500.000.000, se mostrará 5 mil M €. En todo caso, es posible personalizar este formato en el área de formato de la visualización (<em>Formato > Etiqueta de datos > Mostrar unidades</em>).
Es posible dar formato a la etiqueta que representa la cifra (<em>Formato > Etiqueta de datos</em>): color, formato numérico, familia de fuente... así como mostrar u ocultar el texto que se muestra bajo ésta (y modificar su formato: color, tamaño y familia de la fuente). No se puede, sin embargo, modificar dicho texto (por ejemplo, no podríamos cambiarlo por algo como "Número medio de hijos"). Lo que sí podemos hacer es añadir un texto al valor a mostrar creando una medida calculada como el resultado de la concatenación de ambos valores, el texto que nos interese y el valor numérico involucrado. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización. Así, si estamos mostrando información de la medida <em>Sales</em>, podemos crear la siguiente medida basada en ella:
Ventas = CONCATENATE("Ventas totales: "; [Sales])
Y arrastrar esta medida hasta el campo “<em>Campos</em>” de la visualización. Desafortunadamente perdemos de esta forma la opción de dar formato al número (pues se trata como texto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_04.jpg"></a>
Podemos modificar dicho formato si recurrimos a la función <a href="/dax/function/format">FORMAT</a> de DAX, por ejemplo:
Ventas = CONCATENATE("Ventas totales: " & UNICHAR(10); FORMAT([Sales]; "Currency"))
(se ha añadido la función <a href="/dax/function/unichar">UNICHAR</a> para forzar un salto de línea entre el texto y el valor numérico):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_05.jpg"></a>
En el ejemplo anterior se ha ocultado la etiqueta de categoría (<em>Formato > Etiqueta de categoría)</em>.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-91d0be46-804a-4700-8b40-8d32b6ee5611') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La tarjeta es de utilidad cuando queremos mostrar una cifra independiente de cualquier otra referencia, lo que frecuentemente resulta más impactante y fácil de interpretar que otras gráficas más sofisticadas. Su panel de campos es extremadamente sencillo, admitiendo un único campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_01.jpg"></a>
Si llevamos a este campo una medida, se calculará y se mostrará en la visualización. Si llevamos un campo (numérico), podremos escoger la función de agregación a aplicar. Por ejemplo, si llevamos el campo <em>Number of Children</em> de nuestro modelo de datos (campo que contiene el número de hijos de nuestros clientes), podemos escoger entre las siguientes funciones de agregación:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_02.jpg"></a>
Si escogemos, por ejemplo, el promedio, la visualización mostrará el número medio de hijos de los clientes involucrados en el contexto actual (todos, por defecto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_03.jpg"></a>
El formato del valor numérico es, por defecto, automático. Así, si el valor de ventas que se está mostrando alcanza la cifra $4.500.000.000, se mostrará 5 mil M €. En todo caso, es posible personalizar este formato en el área de formato de la visualización (<em>Formato > Etiqueta de datos > Mostrar unidades</em>).
Es posible dar formato a la etiqueta que representa la cifra (<em>Formato > Etiqueta de datos</em>): color, formato numérico, familia de fuente... así como mostrar u ocultar el texto que se muestra bajo ésta (y modificar su formato: color, tamaño y familia de la fuente). No se puede, sin embargo, modificar dicho texto (por ejemplo, no podríamos cambiarlo por algo como "Número medio de hijos"). Lo que sí podemos hacer es añadir un texto al valor a mostrar creando una medida calculada como el resultado de la concatenación de ambos valores, el texto que nos interese y el valor numérico involucrado. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización. Así, si estamos mostrando información de la medida <em>Sales</em>, podemos crear la siguiente medida basada en ella:
Ventas = CONCATENATE("Ventas totales: "; [Sales])
Y arrastrar esta medida hasta el campo “<em>Campos</em>” de la visualización. Desafortunadamente perdemos de esta forma la opción de dar formato al número (pues se trata como texto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_04.jpg"></a>
Podemos modificar dicho formato si recurrimos a la función <a href="/dax/function/format">FORMAT</a> de DAX, por ejemplo:
Ventas = CONCATENATE("Ventas totales: " & UNICHAR(10); FORMAT([Sales]; "Currency"))
(se ha añadido la función <a href="/dax/function/unichar">UNICHAR</a> para forzar un salto de línea entre el texto y el valor numérico):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_05.jpg"></a>
En el ejemplo anterior se ha ocultado la etiqueta de categoría (<em>Formato > Etiqueta de categoría)</em>.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-91d0be46-804a-4700-8b40-8d32b6ee5611') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La tarjeta es de utilidad cuando queremos mostrar una cifra independiente de cualquier otra referencia, lo que frecuentemente resulta más impactante y fácil de interpretar que otras gráficas más sofisticadas. Su panel de campos es extremadamente sencillo, admitiendo un único campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_01.jpg"></a>
Si llevamos a este campo una medida, se calculará y se mostrará en la visualización. Si llevamos un campo (numérico), podremos escoger la función de agregación a aplicar. Por ejemplo, si llevamos el campo <em>Number of Children</em> de nuestro modelo de datos (campo que contiene el número de hijos de nuestros clientes), podemos escoger entre las siguientes funciones de agregación:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_02.jpg"></a>
Si escogemos, por ejemplo, el promedio, la visualización mostrará el número medio de hijos de los clientes involucrados en el contexto actual (todos, por defecto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_03.jpg"></a>
El formato del valor numérico es, por defecto, automático. Así, si el valor de ventas que se está mostrando alcanza la cifra $4.500.000.000, se mostrará 5 mil M €. En todo caso, es posible personalizar este formato en el área de formato de la visualización (<em>Formato > Etiqueta de datos > Mostrar unidades</em>).
Es posible dar formato a la etiqueta que representa la cifra (<em>Formato > Etiqueta de datos</em>): color, formato numérico, familia de fuente... así como mostrar u ocultar el texto que se muestra bajo ésta (y modificar su formato: color, tamaño y familia de la fuente). No se puede, sin embargo, modificar dicho texto (por ejemplo, no podríamos cambiarlo por algo como "Número medio de hijos"). Lo que sí podemos hacer es añadir un texto al valor a mostrar creando una medida calculada como el resultado de la concatenación de ambos valores, el texto que nos interese y el valor numérico involucrado. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización. Así, si estamos mostrando información de la medida <em>Sales</em>, podemos crear la siguiente medida basada en ella:
Ventas = CONCATENATE("Ventas totales: "; [Sales])
Y arrastrar esta medida hasta el campo “<em>Campos</em>” de la visualización. Desafortunadamente perdemos de esta forma la opción de dar formato al número (pues se trata como texto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_04.jpg"></a>
Podemos modificar dicho formato si recurrimos a la función <a href="/dax/function/format">FORMAT</a> de DAX, por ejemplo:
Ventas = CONCATENATE("Ventas totales: " & UNICHAR(10); FORMAT([Sales]; "Currency"))
(se ha añadido la función <a href="/dax/function/unichar">UNICHAR</a> para forzar un salto de línea entre el texto y el valor numérico):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_05.jpg"></a>
En el ejemplo anterior se ha ocultado la etiqueta de categoría (<em>Formato > Etiqueta de categoría)</em>.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-9fddc077-87c3-4e7f-aa94-4eb18f93e8ff') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La tarjeta es de utilidad cuando queremos mostrar una cifra independiente de cualquier otra referencia, lo que frecuentemente resulta más impactante y fácil de interpretar que otras gráficas más sofisticadas. Su panel de campos es extremadamente sencillo, admitiendo un único campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_01.jpg"></a>
Si llevamos a este campo una medida, se calculará y se mostrará en la visualización. Si llevamos un campo (numérico), podremos escoger la función de agregación a aplicar. Por ejemplo, si llevamos el campo <em>Number of Children</em> de nuestro modelo de datos (campo que contiene el número de hijos de nuestros clientes), podemos escoger entre las siguientes funciones de agregación:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_02.jpg"></a>
Si escogemos, por ejemplo, el promedio, la visualización mostrará el número medio de hijos de los clientes involucrados en el contexto actual (todos, por defecto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_03.jpg"></a>
El formato del valor numérico es, por defecto, automático. Así, si el valor de ventas que se está mostrando alcanza la cifra $4.500.000.000, se mostrará 5 mil M €. En todo caso, es posible personalizar este formato en el área de formato de la visualización (<em>Formato > Etiqueta de datos > Mostrar unidades</em>).
Es posible dar formato a la etiqueta que representa la cifra (<em>Formato > Etiqueta de datos</em>): color, formato numérico, familia de fuente... así como mostrar u ocultar el texto que se muestra bajo ésta (y modificar su formato: color, tamaño y familia de la fuente). No se puede, sin embargo, modificar dicho texto (por ejemplo, no podríamos cambiarlo por algo como "Número medio de hijos"). Lo que sí podemos hacer es añadir un texto al valor a mostrar creando una medida calculada como el resultado de la concatenación de ambos valores, el texto que nos interese y el valor numérico involucrado. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización. Así, si estamos mostrando información de la medida <em>Sales</em>, podemos crear la siguiente medida basada en ella:
Ventas = CONCATENATE("Ventas totales: "; [Sales])
Y arrastrar esta medida hasta el campo “<em>Campos</em>” de la visualización. Desafortunadamente perdemos de esta forma la opción de dar formato al número (pues se trata como texto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_04.jpg"></a>
Podemos modificar dicho formato si recurrimos a la función <a href="/dax/function/format">FORMAT</a> de DAX, por ejemplo:
Ventas = CONCATENATE("Ventas totales: " & UNICHAR(10); FORMAT([Sales]; "Currency"))
(se ha añadido la función <a href="/dax/function/unichar">UNICHAR</a> para forzar un salto de línea entre el texto y el valor numérico):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_05.jpg"></a>
En el ejemplo anterior se ha ocultado la etiqueta de categoría (<em>Formato > Etiqueta de categoría)</em>.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-9fddc077-87c3-4e7f-aa94-4eb18f93e8ff') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La tarjeta es de utilidad cuando queremos mostrar una cifra independiente de cualquier otra referencia, lo que frecuentemente resulta más impactante y fácil de interpretar que otras gráficas más sofisticadas. Su panel de campos es extremadamente sencillo, admitiendo un único campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_01.jpg"></a>
Si llevamos a este campo una medida, se calculará y se mostrará en la visualización. Si llevamos un campo (numérico), podremos escoger la función de agregación a aplicar. Por ejemplo, si llevamos el campo <em>Number of Children</em> de nuestro modelo de datos (campo que contiene el número de hijos de nuestros clientes), podemos escoger entre las siguientes funciones de agregación:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_02.jpg"></a>
Si escogemos, por ejemplo, el promedio, la visualización mostrará el número medio de hijos de los clientes involucrados en el contexto actual (todos, por defecto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_03.jpg"></a>
El formato del valor numérico es, por defecto, automático. Así, si el valor de ventas que se está mostrando alcanza la cifra $4.500.000.000, se mostrará 5 mil M €. En todo caso, es posible personalizar este formato en el área de formato de la visualización (<em>Formato > Etiqueta de datos > Mostrar unidades</em>).
Es posible dar formato a la etiqueta que representa la cifra (<em>Formato > Etiqueta de datos</em>): color, formato numérico, familia de fuente... así como mostrar u ocultar el texto que se muestra bajo ésta (y modificar su formato: color, tamaño y familia de la fuente). No se puede, sin embargo, modificar dicho texto (por ejemplo, no podríamos cambiarlo por algo como "Número medio de hijos"). Lo que sí podemos hacer es añadir un texto al valor a mostrar creando una medida calculada como el resultado de la concatenación de ambos valores, el texto que nos interese y el valor numérico involucrado. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización. Así, si estamos mostrando información de la medida <em>Sales</em>, podemos crear la siguiente medida basada en ella:
Ventas = CONCATENATE("Ventas totales: "; [Sales])
Y arrastrar esta medida hasta el campo “<em>Campos</em>” de la visualización. Desafortunadamente perdemos de esta forma la opción de dar formato al número (pues se trata como texto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_04.jpg"></a>
Podemos modificar dicho formato si recurrimos a la función <a href="/dax/function/format">FORMAT</a> de DAX, por ejemplo:
Ventas = CONCATENATE("Ventas totales: " & UNICHAR(10); FORMAT([Sales]; "Currency"))
(se ha añadido la función <a href="/dax/function/unichar">UNICHAR</a> para forzar un salto de línea entre el texto y el valor numérico):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_05.jpg"></a>
En el ejemplo anterior se ha ocultado la etiqueta de categoría (<em>Formato > Etiqueta de categoría)</em>.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-9fddc077-87c3-4e7f-aa94-4eb18f93e8ff') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La tarjeta es de utilidad cuando queremos mostrar una cifra independiente de cualquier otra referencia, lo que frecuentemente resulta más impactante y fácil de interpretar que otras gráficas más sofisticadas. Su panel de campos es extremadamente sencillo, admitiendo un único campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_01.jpg"></a>
Si llevamos a este campo una medida, se calculará y se mostrará en la visualización. Si llevamos un campo (numérico), podremos escoger la función de agregación a aplicar. Por ejemplo, si llevamos el campo <em>Number of Children</em> de nuestro modelo de datos (campo que contiene el número de hijos de nuestros clientes), podemos escoger entre las siguientes funciones de agregación:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_02.jpg"></a>
Si escogemos, por ejemplo, el promedio, la visualización mostrará el número medio de hijos de los clientes involucrados en el contexto actual (todos, por defecto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_03.jpg"></a>
El formato del valor numérico es, por defecto, automático. Así, si el valor de ventas que se está mostrando alcanza la cifra $4.500.000.000, se mostrará 5 mil M €. En todo caso, es posible personalizar este formato en el área de formato de la visualización (<em>Formato > Etiqueta de datos > Mostrar unidades</em>).
Es posible dar formato a la etiqueta que representa la cifra (<em>Formato > Etiqueta de datos</em>): color, formato numérico, familia de fuente... así como mostrar u ocultar el texto que se muestra bajo ésta (y modificar su formato: color, tamaño y familia de la fuente). No se puede, sin embargo, modificar dicho texto (por ejemplo, no podríamos cambiarlo por algo como "Número medio de hijos"). Lo que sí podemos hacer es añadir un texto al valor a mostrar creando una medida calculada como el resultado de la concatenación de ambos valores, el texto que nos interese y el valor numérico involucrado. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización. Así, si estamos mostrando información de la medida <em>Sales</em>, podemos crear la siguiente medida basada en ella:
Ventas = CONCATENATE("Ventas totales: "; [Sales])
Y arrastrar esta medida hasta el campo “<em>Campos</em>” de la visualización. Desafortunadamente perdemos de esta forma la opción de dar formato al número (pues se trata como texto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_04.jpg"></a>
Podemos modificar dicho formato si recurrimos a la función <a href="/dax/function/format">FORMAT</a> de DAX, por ejemplo:
Ventas = CONCATENATE("Ventas totales: " & UNICHAR(10); FORMAT([Sales]; "Currency"))
(se ha añadido la función <a href="/dax/function/unichar">UNICHAR</a> para forzar un salto de línea entre el texto y el valor numérico):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_05.jpg"></a>
En el ejemplo anterior se ha ocultado la etiqueta de categoría (<em>Formato > Etiqueta de categoría)</em>.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-9fddc077-87c3-4e7f-aa94-4eb18f93e8ff') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('La tarjeta es de utilidad cuando queremos mostrar una cifra independiente de cualquier otra referencia, lo que frecuentemente resulta más impactante y fácil de interpretar que otras gráficas más sofisticadas. Su panel de campos es extremadamente sencillo, admitiendo un único campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_01.jpg"></a>
Si llevamos a este campo una medida, se calculará y se mostrará en la visualización. Si llevamos un campo (numérico), podremos escoger la función de agregación a aplicar. Por ejemplo, si llevamos el campo <em>Number of Children</em> de nuestro modelo de datos (campo que contiene el número de hijos de nuestros clientes), podemos escoger entre las siguientes funciones de agregación:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_02.jpg"></a>
Si escogemos, por ejemplo, el promedio, la visualización mostrará el número medio de hijos de los clientes involucrados en el contexto actual (todos, por defecto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_03.jpg"></a>
El formato del valor numérico es, por defecto, automático. Así, si el valor de ventas que se está mostrando alcanza la cifra $4.500.000.000, se mostrará 5 mil M €. En todo caso, es posible personalizar este formato en el área de formato de la visualización (<em>Formato > Etiqueta de datos > Mostrar unidades</em>).
Es posible dar formato a la etiqueta que representa la cifra (<em>Formato > Etiqueta de datos</em>): color, formato numérico, familia de fuente... así como mostrar u ocultar el texto que se muestra bajo ésta (y modificar su formato: color, tamaño y familia de la fuente). No se puede, sin embargo, modificar dicho texto (por ejemplo, no podríamos cambiarlo por algo como "Número medio de hijos"). Lo que sí podemos hacer es añadir un texto al valor a mostrar creando una medida calculada como el resultado de la concatenación de ambos valores, el texto que nos interese y el valor numérico involucrado. Esta medida deberá ser cargada en el campo “<em>Campos</em>” de la visualización. Así, si estamos mostrando información de la medida <em>Sales</em>, podemos crear la siguiente medida basada en ella:
Ventas = CONCATENATE("Ventas totales: "; [Sales])
Y arrastrar esta medida hasta el campo “<em>Campos</em>” de la visualización. Desafortunadamente perdemos de esta forma la opción de dar formato al número (pues se trata como texto):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_04.jpg"></a>
Podemos modificar dicho formato si recurrimos a la función <a href="/dax/function/format">FORMAT</a> de DAX, por ejemplo:
Ventas = CONCATENATE("Ventas totales: " & UNICHAR(10); FORMAT([Sales]; "Currency"))
(se ha añadido la función <a href="/dax/function/unichar">UNICHAR</a> para forzar un salto de línea entre el texto y el valor numérico):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/card_05.jpg"></a>
En el ejemplo anterior se ha ocultado la etiqueta de categoría (<em>Formato > Etiqueta de categoría)</em>.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-5b26a0b4-4734-41a5-bcc6-3e3a9d8536e9') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>gauge</strong>, <strong>medidor</strong> o <strong>gráfico indicador</strong> es especialmente útil si queremos mostrar un valor comparándolo con otro que se considera valor objetivo. Su panel de campos es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_01.jpg"></a>
En este tipo de visualizaciones trabajamos con un valor numérico simple y con un valor objetivo. Adicionalmente podremos limitar el valor mínimo y valor máximo a mostrar en el indicador.
<ul><li>Campo “<em>Valor</em>”: recibirá el valor numérico simple a mostrar. Solo admite uno.</li>
<li>Campo “<em>Valor mínimo</em>”: recibirá el campo que determinará el valor mínimo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Min.</em>”).</li>
<li>Campo “<em>Valor máximo</em>”: recibirá el campo que determinará el valor máximo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Máx.</em>”).</li>
<li>Campo “<em>Valor de destino</em>”: recibirá el campo que determinará el valor objetivo a mostrar en la visualización por medio de una barra (roja por defecto). Al igual que ocurre con los dos campos anteriores, si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Destino</em>”).</li>
<li>Campo “<em>Información sobre herramientas</em>”: recibirá campos cuyo contenido queremos que se muestre en la ventana emergente que se abre al mover el ratón por encima del indicador.</li>
</ul>Los campos <em>Valor mínimo</em>, <em>Valor máximo</em> y <em>Valor de destino</em> solo pueden introducirse en el panel de configuración o en el de opciones, nunca en ambos al mismo tiempo. Es necesario comentar también que la sección <em>Eje medidor</em> del panel de formato no se muestra hasta que no se lleva algún campo al panel de campos de la visualización.
Llevemos, por ejemplo, la medida <em>Sales</em> (conteniendo la suma de los importes de ventas) al campo <em>Valor</em> de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_02.jpg"></a>
Cuando creamos la visualización, el valor máximo toma siempre, por defecto, un valor igual al doble de la cifra mostrada en el medidor. Una vez introduzcamos un valor o una medida en el campo “<em>Valor máximo</em>”, la visualización se adaptará adecuadamente. El valor mínimo, por defecto, es cero.
Ahora podemos llevar campos o medidas de nuestro modelo de datos a los campos adecuados de la visualización para definir el valor objetivo y los valores mínimo y máximo. Por ejemplo, escribamos en <em>Formato > Eje medidor</em> las cifras 2000000 (2 millones) para el valor mínimo, 12000000 (12 millones) para el valor máximo, y 10000000 (10 millones) para el destino:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_03.jpg"></a>
La visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_04.jpg"></a>
Comprobamos que los límites del gráfico son los valores mínimo y máximo que hemos fijado, y que se muestra con una barra roja el objetivo. Si el valor máximo fuese inferior al valor de la métrica, se mostraría todo el indicador de color naranja. Por ejemplo, en la siguiente imagen se ha llevado el valor 5000000 (5 millones) -valor inferior a los 8 millones de ventas- al campo <em>Max.</em> de la sección <em>Formato > Eje medidor</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_06.jpg"></a>
Una limitación de esta visualización es que el color naranja que indica el valor de la métrica, aunque puede personalizarse, no cambia cuando se alcanza el objetivo.
Al mover el cursor por encima de la visualización se muestra la clásica ventana emergente con la información correspondiente, aunque en ésta no se incluye información sobre el objetivo, tan solo sobre la métrica que hayamos llevado al campo <em>Valor</em> (y sobre los campos que hayamos llevado a <em>Información sobre herramientas</em>). En el ejemplo de la siguiente imagen se ha llevado la medida <em>Units</em> (conteniendo el número de unidades vendidas) a dicho campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_05.jpg"></a>
Comentar, por último, que la visualización nos permite escoger -como ya se ha adelantado- el color que representa la métrica siendo mostrada (el naranja de las anteriores imágenes) y el color de la barrita que representa el objetivo (rojo por defecto), ambas opciones personalizables en <em>Formato > Colores de datos</em>. Podemos también mostrar, ocultar y dar formato a la cifra correspondiente a la métrica que se muestra en el centro (<em>Formato > Valor de globo</em>), así como mostrar u ocultar las cifras que se muestran en los extremos de la visualización con los valores mínimo y máximo a representar (<em>Formato > Etiquetas de datos</em>).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-5b26a0b4-4734-41a5-bcc6-3e3a9d8536e9') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>gauge</strong>, <strong>medidor</strong> o <strong>gráfico indicador</strong> es especialmente útil si queremos mostrar un valor comparándolo con otro que se considera valor objetivo. Su panel de campos es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_01.jpg"></a>
En este tipo de visualizaciones trabajamos con un valor numérico simple y con un valor objetivo. Adicionalmente podremos limitar el valor mínimo y valor máximo a mostrar en el indicador.
<ul><li>Campo “<em>Valor</em>”: recibirá el valor numérico simple a mostrar. Solo admite uno.</li>
<li>Campo “<em>Valor mínimo</em>”: recibirá el campo que determinará el valor mínimo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Min.</em>”).</li>
<li>Campo “<em>Valor máximo</em>”: recibirá el campo que determinará el valor máximo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Máx.</em>”).</li>
<li>Campo “<em>Valor de destino</em>”: recibirá el campo que determinará el valor objetivo a mostrar en la visualización por medio de una barra (roja por defecto). Al igual que ocurre con los dos campos anteriores, si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Destino</em>”).</li>
<li>Campo “<em>Información sobre herramientas</em>”: recibirá campos cuyo contenido queremos que se muestre en la ventana emergente que se abre al mover el ratón por encima del indicador.</li>
</ul>Los campos <em>Valor mínimo</em>, <em>Valor máximo</em> y <em>Valor de destino</em> solo pueden introducirse en el panel de configuración o en el de opciones, nunca en ambos al mismo tiempo. Es necesario comentar también que la sección <em>Eje medidor</em> del panel de formato no se muestra hasta que no se lleva algún campo al panel de campos de la visualización.
Llevemos, por ejemplo, la medida <em>Sales</em> (conteniendo la suma de los importes de ventas) al campo <em>Valor</em> de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_02.jpg"></a>
Cuando creamos la visualización, el valor máximo toma siempre, por defecto, un valor igual al doble de la cifra mostrada en el medidor. Una vez introduzcamos un valor o una medida en el campo “<em>Valor máximo</em>”, la visualización se adaptará adecuadamente. El valor mínimo, por defecto, es cero.
Ahora podemos llevar campos o medidas de nuestro modelo de datos a los campos adecuados de la visualización para definir el valor objetivo y los valores mínimo y máximo. Por ejemplo, escribamos en <em>Formato > Eje medidor</em> las cifras 2000000 (2 millones) para el valor mínimo, 12000000 (12 millones) para el valor máximo, y 10000000 (10 millones) para el destino:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_03.jpg"></a>
La visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_04.jpg"></a>
Comprobamos que los límites del gráfico son los valores mínimo y máximo que hemos fijado, y que se muestra con una barra roja el objetivo. Si el valor máximo fuese inferior al valor de la métrica, se mostraría todo el indicador de color naranja. Por ejemplo, en la siguiente imagen se ha llevado el valor 5000000 (5 millones) -valor inferior a los 8 millones de ventas- al campo <em>Max.</em> de la sección <em>Formato > Eje medidor</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_06.jpg"></a>
Una limitación de esta visualización es que el color naranja que indica el valor de la métrica, aunque puede personalizarse, no cambia cuando se alcanza el objetivo.
Al mover el cursor por encima de la visualización se muestra la clásica ventana emergente con la información correspondiente, aunque en ésta no se incluye información sobre el objetivo, tan solo sobre la métrica que hayamos llevado al campo <em>Valor</em> (y sobre los campos que hayamos llevado a <em>Información sobre herramientas</em>). En el ejemplo de la siguiente imagen se ha llevado la medida <em>Units</em> (conteniendo el número de unidades vendidas) a dicho campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_05.jpg"></a>
Comentar, por último, que la visualización nos permite escoger -como ya se ha adelantado- el color que representa la métrica siendo mostrada (el naranja de las anteriores imágenes) y el color de la barrita que representa el objetivo (rojo por defecto), ambas opciones personalizables en <em>Formato > Colores de datos</em>. Podemos también mostrar, ocultar y dar formato a la cifra correspondiente a la métrica que se muestra en el centro (<em>Formato > Valor de globo</em>), así como mostrar u ocultar las cifras que se muestran en los extremos de la visualización con los valores mínimo y máximo a representar (<em>Formato > Etiquetas de datos</em>).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-5b26a0b4-4734-41a5-bcc6-3e3a9d8536e9') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>gauge</strong>, <strong>medidor</strong> o <strong>gráfico indicador</strong> es especialmente útil si queremos mostrar un valor comparándolo con otro que se considera valor objetivo. Su panel de campos es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_01.jpg"></a>
En este tipo de visualizaciones trabajamos con un valor numérico simple y con un valor objetivo. Adicionalmente podremos limitar el valor mínimo y valor máximo a mostrar en el indicador.
<ul><li>Campo “<em>Valor</em>”: recibirá el valor numérico simple a mostrar. Solo admite uno.</li>
<li>Campo “<em>Valor mínimo</em>”: recibirá el campo que determinará el valor mínimo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Min.</em>”).</li>
<li>Campo “<em>Valor máximo</em>”: recibirá el campo que determinará el valor máximo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Máx.</em>”).</li>
<li>Campo “<em>Valor de destino</em>”: recibirá el campo que determinará el valor objetivo a mostrar en la visualización por medio de una barra (roja por defecto). Al igual que ocurre con los dos campos anteriores, si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Destino</em>”).</li>
<li>Campo “<em>Información sobre herramientas</em>”: recibirá campos cuyo contenido queremos que se muestre en la ventana emergente que se abre al mover el ratón por encima del indicador.</li>
</ul>Los campos <em>Valor mínimo</em>, <em>Valor máximo</em> y <em>Valor de destino</em> solo pueden introducirse en el panel de configuración o en el de opciones, nunca en ambos al mismo tiempo. Es necesario comentar también que la sección <em>Eje medidor</em> del panel de formato no se muestra hasta que no se lleva algún campo al panel de campos de la visualización.
Llevemos, por ejemplo, la medida <em>Sales</em> (conteniendo la suma de los importes de ventas) al campo <em>Valor</em> de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_02.jpg"></a>
Cuando creamos la visualización, el valor máximo toma siempre, por defecto, un valor igual al doble de la cifra mostrada en el medidor. Una vez introduzcamos un valor o una medida en el campo “<em>Valor máximo</em>”, la visualización se adaptará adecuadamente. El valor mínimo, por defecto, es cero.
Ahora podemos llevar campos o medidas de nuestro modelo de datos a los campos adecuados de la visualización para definir el valor objetivo y los valores mínimo y máximo. Por ejemplo, escribamos en <em>Formato > Eje medidor</em> las cifras 2000000 (2 millones) para el valor mínimo, 12000000 (12 millones) para el valor máximo, y 10000000 (10 millones) para el destino:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_03.jpg"></a>
La visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_04.jpg"></a>
Comprobamos que los límites del gráfico son los valores mínimo y máximo que hemos fijado, y que se muestra con una barra roja el objetivo. Si el valor máximo fuese inferior al valor de la métrica, se mostraría todo el indicador de color naranja. Por ejemplo, en la siguiente imagen se ha llevado el valor 5000000 (5 millones) -valor inferior a los 8 millones de ventas- al campo <em>Max.</em> de la sección <em>Formato > Eje medidor</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_06.jpg"></a>
Una limitación de esta visualización es que el color naranja que indica el valor de la métrica, aunque puede personalizarse, no cambia cuando se alcanza el objetivo.
Al mover el cursor por encima de la visualización se muestra la clásica ventana emergente con la información correspondiente, aunque en ésta no se incluye información sobre el objetivo, tan solo sobre la métrica que hayamos llevado al campo <em>Valor</em> (y sobre los campos que hayamos llevado a <em>Información sobre herramientas</em>). En el ejemplo de la siguiente imagen se ha llevado la medida <em>Units</em> (conteniendo el número de unidades vendidas) a dicho campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_05.jpg"></a>
Comentar, por último, que la visualización nos permite escoger -como ya se ha adelantado- el color que representa la métrica siendo mostrada (el naranja de las anteriores imágenes) y el color de la barrita que representa el objetivo (rojo por defecto), ambas opciones personalizables en <em>Formato > Colores de datos</em>. Podemos también mostrar, ocultar y dar formato a la cifra correspondiente a la métrica que se muestra en el centro (<em>Formato > Valor de globo</em>), así como mostrar u ocultar las cifras que se muestran en los extremos de la visualización con los valores mínimo y máximo a representar (<em>Formato > Etiquetas de datos</em>).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-5b26a0b4-4734-41a5-bcc6-3e3a9d8536e9') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>gauge</strong>, <strong>medidor</strong> o <strong>gráfico indicador</strong> es especialmente útil si queremos mostrar un valor comparándolo con otro que se considera valor objetivo. Su panel de campos es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_01.jpg"></a>
En este tipo de visualizaciones trabajamos con un valor numérico simple y con un valor objetivo. Adicionalmente podremos limitar el valor mínimo y valor máximo a mostrar en el indicador.
<ul><li>Campo “<em>Valor</em>”: recibirá el valor numérico simple a mostrar. Solo admite uno.</li>
<li>Campo “<em>Valor mínimo</em>”: recibirá el campo que determinará el valor mínimo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Min.</em>”).</li>
<li>Campo “<em>Valor máximo</em>”: recibirá el campo que determinará el valor máximo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Máx.</em>”).</li>
<li>Campo “<em>Valor de destino</em>”: recibirá el campo que determinará el valor objetivo a mostrar en la visualización por medio de una barra (roja por defecto). Al igual que ocurre con los dos campos anteriores, si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Destino</em>”).</li>
<li>Campo “<em>Información sobre herramientas</em>”: recibirá campos cuyo contenido queremos que se muestre en la ventana emergente que se abre al mover el ratón por encima del indicador.</li>
</ul>Los campos <em>Valor mínimo</em>, <em>Valor máximo</em> y <em>Valor de destino</em> solo pueden introducirse en el panel de configuración o en el de opciones, nunca en ambos al mismo tiempo. Es necesario comentar también que la sección <em>Eje medidor</em> del panel de formato no se muestra hasta que no se lleva algún campo al panel de campos de la visualización.
Llevemos, por ejemplo, la medida <em>Sales</em> (conteniendo la suma de los importes de ventas) al campo <em>Valor</em> de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_02.jpg"></a>
Cuando creamos la visualización, el valor máximo toma siempre, por defecto, un valor igual al doble de la cifra mostrada en el medidor. Una vez introduzcamos un valor o una medida en el campo “<em>Valor máximo</em>”, la visualización se adaptará adecuadamente. El valor mínimo, por defecto, es cero.
Ahora podemos llevar campos o medidas de nuestro modelo de datos a los campos adecuados de la visualización para definir el valor objetivo y los valores mínimo y máximo. Por ejemplo, escribamos en <em>Formato > Eje medidor</em> las cifras 2000000 (2 millones) para el valor mínimo, 12000000 (12 millones) para el valor máximo, y 10000000 (10 millones) para el destino:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_03.jpg"></a>
La visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_04.jpg"></a>
Comprobamos que los límites del gráfico son los valores mínimo y máximo que hemos fijado, y que se muestra con una barra roja el objetivo. Si el valor máximo fuese inferior al valor de la métrica, se mostraría todo el indicador de color naranja. Por ejemplo, en la siguiente imagen se ha llevado el valor 5000000 (5 millones) -valor inferior a los 8 millones de ventas- al campo <em>Max.</em> de la sección <em>Formato > Eje medidor</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_06.jpg"></a>
Una limitación de esta visualización es que el color naranja que indica el valor de la métrica, aunque puede personalizarse, no cambia cuando se alcanza el objetivo.
Al mover el cursor por encima de la visualización se muestra la clásica ventana emergente con la información correspondiente, aunque en ésta no se incluye información sobre el objetivo, tan solo sobre la métrica que hayamos llevado al campo <em>Valor</em> (y sobre los campos que hayamos llevado a <em>Información sobre herramientas</em>). En el ejemplo de la siguiente imagen se ha llevado la medida <em>Units</em> (conteniendo el número de unidades vendidas) a dicho campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_05.jpg"></a>
Comentar, por último, que la visualización nos permite escoger -como ya se ha adelantado- el color que representa la métrica siendo mostrada (el naranja de las anteriores imágenes) y el color de la barrita que representa el objetivo (rojo por defecto), ambas opciones personalizables en <em>Formato > Colores de datos</em>. Podemos también mostrar, ocultar y dar formato a la cifra correspondiente a la métrica que se muestra en el centro (<em>Formato > Valor de globo</em>), así como mostrar u ocultar las cifras que se muestran en los extremos de la visualización con los valores mínimo y máximo a representar (<em>Formato > Etiquetas de datos</em>).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-2acd588b-540c-4d98-bbb3-3f3953cad44d') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>gauge</strong>, <strong>medidor</strong> o <strong>gráfico indicador</strong> es especialmente útil si queremos mostrar un valor comparándolo con otro que se considera valor objetivo. Su panel de campos es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_01.jpg"></a>
En este tipo de visualizaciones trabajamos con un valor numérico simple y con un valor objetivo. Adicionalmente podremos limitar el valor mínimo y valor máximo a mostrar en el indicador.
<ul><li>Campo “<em>Valor</em>”: recibirá el valor numérico simple a mostrar. Solo admite uno.</li>
<li>Campo “<em>Valor mínimo</em>”: recibirá el campo que determinará el valor mínimo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Min.</em>”).</li>
<li>Campo “<em>Valor máximo</em>”: recibirá el campo que determinará el valor máximo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Máx.</em>”).</li>
<li>Campo “<em>Valor de destino</em>”: recibirá el campo que determinará el valor objetivo a mostrar en la visualización por medio de una barra (roja por defecto). Al igual que ocurre con los dos campos anteriores, si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Destino</em>”).</li>
<li>Campo “<em>Información sobre herramientas</em>”: recibirá campos cuyo contenido queremos que se muestre en la ventana emergente que se abre al mover el ratón por encima del indicador.</li>
</ul>Los campos <em>Valor mínimo</em>, <em>Valor máximo</em> y <em>Valor de destino</em> solo pueden introducirse en el panel de configuración o en el de opciones, nunca en ambos al mismo tiempo. Es necesario comentar también que la sección <em>Eje medidor</em> del panel de formato no se muestra hasta que no se lleva algún campo al panel de campos de la visualización.
Llevemos, por ejemplo, la medida <em>Sales</em> (conteniendo la suma de los importes de ventas) al campo <em>Valor</em> de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_02.jpg"></a>
Cuando creamos la visualización, el valor máximo toma siempre, por defecto, un valor igual al doble de la cifra mostrada en el medidor. Una vez introduzcamos un valor o una medida en el campo “<em>Valor máximo</em>”, la visualización se adaptará adecuadamente. El valor mínimo, por defecto, es cero.
Ahora podemos llevar campos o medidas de nuestro modelo de datos a los campos adecuados de la visualización para definir el valor objetivo y los valores mínimo y máximo. Por ejemplo, escribamos en <em>Formato > Eje medidor</em> las cifras 2000000 (2 millones) para el valor mínimo, 12000000 (12 millones) para el valor máximo, y 10000000 (10 millones) para el destino:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_03.jpg"></a>
La visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_04.jpg"></a>
Comprobamos que los límites del gráfico son los valores mínimo y máximo que hemos fijado, y que se muestra con una barra roja el objetivo. Si el valor máximo fuese inferior al valor de la métrica, se mostraría todo el indicador de color naranja. Por ejemplo, en la siguiente imagen se ha llevado el valor 5000000 (5 millones) -valor inferior a los 8 millones de ventas- al campo <em>Max.</em> de la sección <em>Formato > Eje medidor</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_06.jpg"></a>
Una limitación de esta visualización es que el color naranja que indica el valor de la métrica, aunque puede personalizarse, no cambia cuando se alcanza el objetivo.
Al mover el cursor por encima de la visualización se muestra la clásica ventana emergente con la información correspondiente, aunque en ésta no se incluye información sobre el objetivo, tan solo sobre la métrica que hayamos llevado al campo <em>Valor</em> (y sobre los campos que hayamos llevado a <em>Información sobre herramientas</em>). En el ejemplo de la siguiente imagen se ha llevado la medida <em>Units</em> (conteniendo el número de unidades vendidas) a dicho campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_05.jpg"></a>
Comentar, por último, que la visualización nos permite escoger -como ya se ha adelantado- el color que representa la métrica siendo mostrada (el naranja de las anteriores imágenes) y el color de la barrita que representa el objetivo (rojo por defecto), ambas opciones personalizables en <em>Formato > Colores de datos</em>. Podemos también mostrar, ocultar y dar formato a la cifra correspondiente a la métrica que se muestra en el centro (<em>Formato > Valor de globo</em>), así como mostrar u ocultar las cifras que se muestran en los extremos de la visualización con los valores mínimo y máximo a representar (<em>Formato > Etiquetas de datos</em>).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-2acd588b-540c-4d98-bbb3-3f3953cad44d') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>gauge</strong>, <strong>medidor</strong> o <strong>gráfico indicador</strong> es especialmente útil si queremos mostrar un valor comparándolo con otro que se considera valor objetivo. Su panel de campos es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_01.jpg"></a>
En este tipo de visualizaciones trabajamos con un valor numérico simple y con un valor objetivo. Adicionalmente podremos limitar el valor mínimo y valor máximo a mostrar en el indicador.
<ul><li>Campo “<em>Valor</em>”: recibirá el valor numérico simple a mostrar. Solo admite uno.</li>
<li>Campo “<em>Valor mínimo</em>”: recibirá el campo que determinará el valor mínimo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Min.</em>”).</li>
<li>Campo “<em>Valor máximo</em>”: recibirá el campo que determinará el valor máximo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Máx.</em>”).</li>
<li>Campo “<em>Valor de destino</em>”: recibirá el campo que determinará el valor objetivo a mostrar en la visualización por medio de una barra (roja por defecto). Al igual que ocurre con los dos campos anteriores, si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Destino</em>”).</li>
<li>Campo “<em>Información sobre herramientas</em>”: recibirá campos cuyo contenido queremos que se muestre en la ventana emergente que se abre al mover el ratón por encima del indicador.</li>
</ul>Los campos <em>Valor mínimo</em>, <em>Valor máximo</em> y <em>Valor de destino</em> solo pueden introducirse en el panel de configuración o en el de opciones, nunca en ambos al mismo tiempo. Es necesario comentar también que la sección <em>Eje medidor</em> del panel de formato no se muestra hasta que no se lleva algún campo al panel de campos de la visualización.
Llevemos, por ejemplo, la medida <em>Sales</em> (conteniendo la suma de los importes de ventas) al campo <em>Valor</em> de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_02.jpg"></a>
Cuando creamos la visualización, el valor máximo toma siempre, por defecto, un valor igual al doble de la cifra mostrada en el medidor. Una vez introduzcamos un valor o una medida en el campo “<em>Valor máximo</em>”, la visualización se adaptará adecuadamente. El valor mínimo, por defecto, es cero.
Ahora podemos llevar campos o medidas de nuestro modelo de datos a los campos adecuados de la visualización para definir el valor objetivo y los valores mínimo y máximo. Por ejemplo, escribamos en <em>Formato > Eje medidor</em> las cifras 2000000 (2 millones) para el valor mínimo, 12000000 (12 millones) para el valor máximo, y 10000000 (10 millones) para el destino:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_03.jpg"></a>
La visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_04.jpg"></a>
Comprobamos que los límites del gráfico son los valores mínimo y máximo que hemos fijado, y que se muestra con una barra roja el objetivo. Si el valor máximo fuese inferior al valor de la métrica, se mostraría todo el indicador de color naranja. Por ejemplo, en la siguiente imagen se ha llevado el valor 5000000 (5 millones) -valor inferior a los 8 millones de ventas- al campo <em>Max.</em> de la sección <em>Formato > Eje medidor</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_06.jpg"></a>
Una limitación de esta visualización es que el color naranja que indica el valor de la métrica, aunque puede personalizarse, no cambia cuando se alcanza el objetivo.
Al mover el cursor por encima de la visualización se muestra la clásica ventana emergente con la información correspondiente, aunque en ésta no se incluye información sobre el objetivo, tan solo sobre la métrica que hayamos llevado al campo <em>Valor</em> (y sobre los campos que hayamos llevado a <em>Información sobre herramientas</em>). En el ejemplo de la siguiente imagen se ha llevado la medida <em>Units</em> (conteniendo el número de unidades vendidas) a dicho campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_05.jpg"></a>
Comentar, por último, que la visualización nos permite escoger -como ya se ha adelantado- el color que representa la métrica siendo mostrada (el naranja de las anteriores imágenes) y el color de la barrita que representa el objetivo (rojo por defecto), ambas opciones personalizables en <em>Formato > Colores de datos</em>. Podemos también mostrar, ocultar y dar formato a la cifra correspondiente a la métrica que se muestra en el centro (<em>Formato > Valor de globo</em>), así como mostrar u ocultar las cifras que se muestran en los extremos de la visualización con los valores mínimo y máximo a representar (<em>Formato > Etiquetas de datos</em>).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-2acd588b-540c-4d98-bbb3-3f3953cad44d') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>gauge</strong>, <strong>medidor</strong> o <strong>gráfico indicador</strong> es especialmente útil si queremos mostrar un valor comparándolo con otro que se considera valor objetivo. Su panel de campos es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_01.jpg"></a>
En este tipo de visualizaciones trabajamos con un valor numérico simple y con un valor objetivo. Adicionalmente podremos limitar el valor mínimo y valor máximo a mostrar en el indicador.
<ul><li>Campo “<em>Valor</em>”: recibirá el valor numérico simple a mostrar. Solo admite uno.</li>
<li>Campo “<em>Valor mínimo</em>”: recibirá el campo que determinará el valor mínimo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Min.</em>”).</li>
<li>Campo “<em>Valor máximo</em>”: recibirá el campo que determinará el valor máximo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Máx.</em>”).</li>
<li>Campo “<em>Valor de destino</em>”: recibirá el campo que determinará el valor objetivo a mostrar en la visualización por medio de una barra (roja por defecto). Al igual que ocurre con los dos campos anteriores, si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Destino</em>”).</li>
<li>Campo “<em>Información sobre herramientas</em>”: recibirá campos cuyo contenido queremos que se muestre en la ventana emergente que se abre al mover el ratón por encima del indicador.</li>
</ul>Los campos <em>Valor mínimo</em>, <em>Valor máximo</em> y <em>Valor de destino</em> solo pueden introducirse en el panel de configuración o en el de opciones, nunca en ambos al mismo tiempo. Es necesario comentar también que la sección <em>Eje medidor</em> del panel de formato no se muestra hasta que no se lleva algún campo al panel de campos de la visualización.
Llevemos, por ejemplo, la medida <em>Sales</em> (conteniendo la suma de los importes de ventas) al campo <em>Valor</em> de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_02.jpg"></a>
Cuando creamos la visualización, el valor máximo toma siempre, por defecto, un valor igual al doble de la cifra mostrada en el medidor. Una vez introduzcamos un valor o una medida en el campo “<em>Valor máximo</em>”, la visualización se adaptará adecuadamente. El valor mínimo, por defecto, es cero.
Ahora podemos llevar campos o medidas de nuestro modelo de datos a los campos adecuados de la visualización para definir el valor objetivo y los valores mínimo y máximo. Por ejemplo, escribamos en <em>Formato > Eje medidor</em> las cifras 2000000 (2 millones) para el valor mínimo, 12000000 (12 millones) para el valor máximo, y 10000000 (10 millones) para el destino:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_03.jpg"></a>
La visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_04.jpg"></a>
Comprobamos que los límites del gráfico son los valores mínimo y máximo que hemos fijado, y que se muestra con una barra roja el objetivo. Si el valor máximo fuese inferior al valor de la métrica, se mostraría todo el indicador de color naranja. Por ejemplo, en la siguiente imagen se ha llevado el valor 5000000 (5 millones) -valor inferior a los 8 millones de ventas- al campo <em>Max.</em> de la sección <em>Formato > Eje medidor</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_06.jpg"></a>
Una limitación de esta visualización es que el color naranja que indica el valor de la métrica, aunque puede personalizarse, no cambia cuando se alcanza el objetivo.
Al mover el cursor por encima de la visualización se muestra la clásica ventana emergente con la información correspondiente, aunque en ésta no se incluye información sobre el objetivo, tan solo sobre la métrica que hayamos llevado al campo <em>Valor</em> (y sobre los campos que hayamos llevado a <em>Información sobre herramientas</em>). En el ejemplo de la siguiente imagen se ha llevado la medida <em>Units</em> (conteniendo el número de unidades vendidas) a dicho campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_05.jpg"></a>
Comentar, por último, que la visualización nos permite escoger -como ya se ha adelantado- el color que representa la métrica siendo mostrada (el naranja de las anteriores imágenes) y el color de la barrita que representa el objetivo (rojo por defecto), ambas opciones personalizables en <em>Formato > Colores de datos</em>. Podemos también mostrar, ocultar y dar formato a la cifra correspondiente a la métrica que se muestra en el centro (<em>Formato > Valor de globo</em>), así como mostrar u ocultar las cifras que se muestran en los extremos de la visualización con los valores mínimo y máximo a representar (<em>Formato > Etiquetas de datos</em>).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-2acd588b-540c-4d98-bbb3-3f3953cad44d') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>gauge</strong>, <strong>medidor</strong> o <strong>gráfico indicador</strong> es especialmente útil si queremos mostrar un valor comparándolo con otro que se considera valor objetivo. Su panel de campos es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_01.jpg"></a>
En este tipo de visualizaciones trabajamos con un valor numérico simple y con un valor objetivo. Adicionalmente podremos limitar el valor mínimo y valor máximo a mostrar en el indicador.
<ul><li>Campo “<em>Valor</em>”: recibirá el valor numérico simple a mostrar. Solo admite uno.</li>
<li>Campo “<em>Valor mínimo</em>”: recibirá el campo que determinará el valor mínimo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Min.</em>”).</li>
<li>Campo “<em>Valor máximo</em>”: recibirá el campo que determinará el valor máximo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Máx.</em>”).</li>
<li>Campo “<em>Valor de destino</em>”: recibirá el campo que determinará el valor objetivo a mostrar en la visualización por medio de una barra (roja por defecto). Al igual que ocurre con los dos campos anteriores, si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Destino</em>”).</li>
<li>Campo “<em>Información sobre herramientas</em>”: recibirá campos cuyo contenido queremos que se muestre en la ventana emergente que se abre al mover el ratón por encima del indicador.</li>
</ul>Los campos <em>Valor mínimo</em>, <em>Valor máximo</em> y <em>Valor de destino</em> solo pueden introducirse en el panel de configuración o en el de opciones, nunca en ambos al mismo tiempo. Es necesario comentar también que la sección <em>Eje medidor</em> del panel de formato no se muestra hasta que no se lleva algún campo al panel de campos de la visualización.
Llevemos, por ejemplo, la medida <em>Sales</em> (conteniendo la suma de los importes de ventas) al campo <em>Valor</em> de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_02.jpg"></a>
Cuando creamos la visualización, el valor máximo toma siempre, por defecto, un valor igual al doble de la cifra mostrada en el medidor. Una vez introduzcamos un valor o una medida en el campo “<em>Valor máximo</em>”, la visualización se adaptará adecuadamente. El valor mínimo, por defecto, es cero.
Ahora podemos llevar campos o medidas de nuestro modelo de datos a los campos adecuados de la visualización para definir el valor objetivo y los valores mínimo y máximo. Por ejemplo, escribamos en <em>Formato > Eje medidor</em> las cifras 2000000 (2 millones) para el valor mínimo, 12000000 (12 millones) para el valor máximo, y 10000000 (10 millones) para el destino:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_03.jpg"></a>
La visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_04.jpg"></a>
Comprobamos que los límites del gráfico son los valores mínimo y máximo que hemos fijado, y que se muestra con una barra roja el objetivo. Si el valor máximo fuese inferior al valor de la métrica, se mostraría todo el indicador de color naranja. Por ejemplo, en la siguiente imagen se ha llevado el valor 5000000 (5 millones) -valor inferior a los 8 millones de ventas- al campo <em>Max.</em> de la sección <em>Formato > Eje medidor</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_06.jpg"></a>
Una limitación de esta visualización es que el color naranja que indica el valor de la métrica, aunque puede personalizarse, no cambia cuando se alcanza el objetivo.
Al mover el cursor por encima de la visualización se muestra la clásica ventana emergente con la información correspondiente, aunque en ésta no se incluye información sobre el objetivo, tan solo sobre la métrica que hayamos llevado al campo <em>Valor</em> (y sobre los campos que hayamos llevado a <em>Información sobre herramientas</em>). En el ejemplo de la siguiente imagen se ha llevado la medida <em>Units</em> (conteniendo el número de unidades vendidas) a dicho campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_05.jpg"></a>
Comentar, por último, que la visualización nos permite escoger -como ya se ha adelantado- el color que representa la métrica siendo mostrada (el naranja de las anteriores imágenes) y el color de la barrita que representa el objetivo (rojo por defecto), ambas opciones personalizables en <em>Formato > Colores de datos</em>. Podemos también mostrar, ocultar y dar formato a la cifra correspondiente a la métrica que se muestra en el centro (<em>Formato > Valor de globo</em>), así como mostrar u ocultar las cifras que se muestran en los extremos de la visualización con los valores mínimo y máximo a representar (<em>Formato > Etiquetas de datos</em>).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-e6431c98-5391-426f-8147-d255f14839af') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>gauge</strong>, <strong>medidor</strong> o <strong>gráfico indicador</strong> es especialmente útil si queremos mostrar un valor comparándolo con otro que se considera valor objetivo. Su panel de campos es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_01.jpg"></a>
En este tipo de visualizaciones trabajamos con un valor numérico simple y con un valor objetivo. Adicionalmente podremos limitar el valor mínimo y valor máximo a mostrar en el indicador.
<ul><li>Campo “<em>Valor</em>”: recibirá el valor numérico simple a mostrar. Solo admite uno.</li>
<li>Campo “<em>Valor mínimo</em>”: recibirá el campo que determinará el valor mínimo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Min.</em>”).</li>
<li>Campo “<em>Valor máximo</em>”: recibirá el campo que determinará el valor máximo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Máx.</em>”).</li>
<li>Campo “<em>Valor de destino</em>”: recibirá el campo que determinará el valor objetivo a mostrar en la visualización por medio de una barra (roja por defecto). Al igual que ocurre con los dos campos anteriores, si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Destino</em>”).</li>
<li>Campo “<em>Información sobre herramientas</em>”: recibirá campos cuyo contenido queremos que se muestre en la ventana emergente que se abre al mover el ratón por encima del indicador.</li>
</ul>Los campos <em>Valor mínimo</em>, <em>Valor máximo</em> y <em>Valor de destino</em> solo pueden introducirse en el panel de configuración o en el de opciones, nunca en ambos al mismo tiempo. Es necesario comentar también que la sección <em>Eje medidor</em> del panel de formato no se muestra hasta que no se lleva algún campo al panel de campos de la visualización.
Llevemos, por ejemplo, la medida <em>Sales</em> (conteniendo la suma de los importes de ventas) al campo <em>Valor</em> de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_02.jpg"></a>
Cuando creamos la visualización, el valor máximo toma siempre, por defecto, un valor igual al doble de la cifra mostrada en el medidor. Una vez introduzcamos un valor o una medida en el campo “<em>Valor máximo</em>”, la visualización se adaptará adecuadamente. El valor mínimo, por defecto, es cero.
Ahora podemos llevar campos o medidas de nuestro modelo de datos a los campos adecuados de la visualización para definir el valor objetivo y los valores mínimo y máximo. Por ejemplo, escribamos en <em>Formato > Eje medidor</em> las cifras 2000000 (2 millones) para el valor mínimo, 12000000 (12 millones) para el valor máximo, y 10000000 (10 millones) para el destino:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_03.jpg"></a>
La visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_04.jpg"></a>
Comprobamos que los límites del gráfico son los valores mínimo y máximo que hemos fijado, y que se muestra con una barra roja el objetivo. Si el valor máximo fuese inferior al valor de la métrica, se mostraría todo el indicador de color naranja. Por ejemplo, en la siguiente imagen se ha llevado el valor 5000000 (5 millones) -valor inferior a los 8 millones de ventas- al campo <em>Max.</em> de la sección <em>Formato > Eje medidor</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_06.jpg"></a>
Una limitación de esta visualización es que el color naranja que indica el valor de la métrica, aunque puede personalizarse, no cambia cuando se alcanza el objetivo.
Al mover el cursor por encima de la visualización se muestra la clásica ventana emergente con la información correspondiente, aunque en ésta no se incluye información sobre el objetivo, tan solo sobre la métrica que hayamos llevado al campo <em>Valor</em> (y sobre los campos que hayamos llevado a <em>Información sobre herramientas</em>). En el ejemplo de la siguiente imagen se ha llevado la medida <em>Units</em> (conteniendo el número de unidades vendidas) a dicho campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_05.jpg"></a>
Comentar, por último, que la visualización nos permite escoger -como ya se ha adelantado- el color que representa la métrica siendo mostrada (el naranja de las anteriores imágenes) y el color de la barrita que representa el objetivo (rojo por defecto), ambas opciones personalizables en <em>Formato > Colores de datos</em>. Podemos también mostrar, ocultar y dar formato a la cifra correspondiente a la métrica que se muestra en el centro (<em>Formato > Valor de globo</em>), así como mostrar u ocultar las cifras que se muestran en los extremos de la visualización con los valores mínimo y máximo a representar (<em>Formato > Etiquetas de datos</em>).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-e6431c98-5391-426f-8147-d255f14839af') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>gauge</strong>, <strong>medidor</strong> o <strong>gráfico indicador</strong> es especialmente útil si queremos mostrar un valor comparándolo con otro que se considera valor objetivo. Su panel de campos es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_01.jpg"></a>
En este tipo de visualizaciones trabajamos con un valor numérico simple y con un valor objetivo. Adicionalmente podremos limitar el valor mínimo y valor máximo a mostrar en el indicador.
<ul><li>Campo “<em>Valor</em>”: recibirá el valor numérico simple a mostrar. Solo admite uno.</li>
<li>Campo “<em>Valor mínimo</em>”: recibirá el campo que determinará el valor mínimo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Min.</em>”).</li>
<li>Campo “<em>Valor máximo</em>”: recibirá el campo que determinará el valor máximo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Máx.</em>”).</li>
<li>Campo “<em>Valor de destino</em>”: recibirá el campo que determinará el valor objetivo a mostrar en la visualización por medio de una barra (roja por defecto). Al igual que ocurre con los dos campos anteriores, si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Destino</em>”).</li>
<li>Campo “<em>Información sobre herramientas</em>”: recibirá campos cuyo contenido queremos que se muestre en la ventana emergente que se abre al mover el ratón por encima del indicador.</li>
</ul>Los campos <em>Valor mínimo</em>, <em>Valor máximo</em> y <em>Valor de destino</em> solo pueden introducirse en el panel de configuración o en el de opciones, nunca en ambos al mismo tiempo. Es necesario comentar también que la sección <em>Eje medidor</em> del panel de formato no se muestra hasta que no se lleva algún campo al panel de campos de la visualización.
Llevemos, por ejemplo, la medida <em>Sales</em> (conteniendo la suma de los importes de ventas) al campo <em>Valor</em> de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_02.jpg"></a>
Cuando creamos la visualización, el valor máximo toma siempre, por defecto, un valor igual al doble de la cifra mostrada en el medidor. Una vez introduzcamos un valor o una medida en el campo “<em>Valor máximo</em>”, la visualización se adaptará adecuadamente. El valor mínimo, por defecto, es cero.
Ahora podemos llevar campos o medidas de nuestro modelo de datos a los campos adecuados de la visualización para definir el valor objetivo y los valores mínimo y máximo. Por ejemplo, escribamos en <em>Formato > Eje medidor</em> las cifras 2000000 (2 millones) para el valor mínimo, 12000000 (12 millones) para el valor máximo, y 10000000 (10 millones) para el destino:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_03.jpg"></a>
La visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_04.jpg"></a>
Comprobamos que los límites del gráfico son los valores mínimo y máximo que hemos fijado, y que se muestra con una barra roja el objetivo. Si el valor máximo fuese inferior al valor de la métrica, se mostraría todo el indicador de color naranja. Por ejemplo, en la siguiente imagen se ha llevado el valor 5000000 (5 millones) -valor inferior a los 8 millones de ventas- al campo <em>Max.</em> de la sección <em>Formato > Eje medidor</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_06.jpg"></a>
Una limitación de esta visualización es que el color naranja que indica el valor de la métrica, aunque puede personalizarse, no cambia cuando se alcanza el objetivo.
Al mover el cursor por encima de la visualización se muestra la clásica ventana emergente con la información correspondiente, aunque en ésta no se incluye información sobre el objetivo, tan solo sobre la métrica que hayamos llevado al campo <em>Valor</em> (y sobre los campos que hayamos llevado a <em>Información sobre herramientas</em>). En el ejemplo de la siguiente imagen se ha llevado la medida <em>Units</em> (conteniendo el número de unidades vendidas) a dicho campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_05.jpg"></a>
Comentar, por último, que la visualización nos permite escoger -como ya se ha adelantado- el color que representa la métrica siendo mostrada (el naranja de las anteriores imágenes) y el color de la barrita que representa el objetivo (rojo por defecto), ambas opciones personalizables en <em>Formato > Colores de datos</em>. Podemos también mostrar, ocultar y dar formato a la cifra correspondiente a la métrica que se muestra en el centro (<em>Formato > Valor de globo</em>), así como mostrar u ocultar las cifras que se muestran en los extremos de la visualización con los valores mínimo y máximo a representar (<em>Formato > Etiquetas de datos</em>).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-e6431c98-5391-426f-8147-d255f14839af') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>gauge</strong>, <strong>medidor</strong> o <strong>gráfico indicador</strong> es especialmente útil si queremos mostrar un valor comparándolo con otro que se considera valor objetivo. Su panel de campos es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_01.jpg"></a>
En este tipo de visualizaciones trabajamos con un valor numérico simple y con un valor objetivo. Adicionalmente podremos limitar el valor mínimo y valor máximo a mostrar en el indicador.
<ul><li>Campo “<em>Valor</em>”: recibirá el valor numérico simple a mostrar. Solo admite uno.</li>
<li>Campo “<em>Valor mínimo</em>”: recibirá el campo que determinará el valor mínimo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Min.</em>”).</li>
<li>Campo “<em>Valor máximo</em>”: recibirá el campo que determinará el valor máximo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Máx.</em>”).</li>
<li>Campo “<em>Valor de destino</em>”: recibirá el campo que determinará el valor objetivo a mostrar en la visualización por medio de una barra (roja por defecto). Al igual que ocurre con los dos campos anteriores, si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Destino</em>”).</li>
<li>Campo “<em>Información sobre herramientas</em>”: recibirá campos cuyo contenido queremos que se muestre en la ventana emergente que se abre al mover el ratón por encima del indicador.</li>
</ul>Los campos <em>Valor mínimo</em>, <em>Valor máximo</em> y <em>Valor de destino</em> solo pueden introducirse en el panel de configuración o en el de opciones, nunca en ambos al mismo tiempo. Es necesario comentar también que la sección <em>Eje medidor</em> del panel de formato no se muestra hasta que no se lleva algún campo al panel de campos de la visualización.
Llevemos, por ejemplo, la medida <em>Sales</em> (conteniendo la suma de los importes de ventas) al campo <em>Valor</em> de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_02.jpg"></a>
Cuando creamos la visualización, el valor máximo toma siempre, por defecto, un valor igual al doble de la cifra mostrada en el medidor. Una vez introduzcamos un valor o una medida en el campo “<em>Valor máximo</em>”, la visualización se adaptará adecuadamente. El valor mínimo, por defecto, es cero.
Ahora podemos llevar campos o medidas de nuestro modelo de datos a los campos adecuados de la visualización para definir el valor objetivo y los valores mínimo y máximo. Por ejemplo, escribamos en <em>Formato > Eje medidor</em> las cifras 2000000 (2 millones) para el valor mínimo, 12000000 (12 millones) para el valor máximo, y 10000000 (10 millones) para el destino:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_03.jpg"></a>
La visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_04.jpg"></a>
Comprobamos que los límites del gráfico son los valores mínimo y máximo que hemos fijado, y que se muestra con una barra roja el objetivo. Si el valor máximo fuese inferior al valor de la métrica, se mostraría todo el indicador de color naranja. Por ejemplo, en la siguiente imagen se ha llevado el valor 5000000 (5 millones) -valor inferior a los 8 millones de ventas- al campo <em>Max.</em> de la sección <em>Formato > Eje medidor</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_06.jpg"></a>
Una limitación de esta visualización es que el color naranja que indica el valor de la métrica, aunque puede personalizarse, no cambia cuando se alcanza el objetivo.
Al mover el cursor por encima de la visualización se muestra la clásica ventana emergente con la información correspondiente, aunque en ésta no se incluye información sobre el objetivo, tan solo sobre la métrica que hayamos llevado al campo <em>Valor</em> (y sobre los campos que hayamos llevado a <em>Información sobre herramientas</em>). En el ejemplo de la siguiente imagen se ha llevado la medida <em>Units</em> (conteniendo el número de unidades vendidas) a dicho campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_05.jpg"></a>
Comentar, por último, que la visualización nos permite escoger -como ya se ha adelantado- el color que representa la métrica siendo mostrada (el naranja de las anteriores imágenes) y el color de la barrita que representa el objetivo (rojo por defecto), ambas opciones personalizables en <em>Formato > Colores de datos</em>. Podemos también mostrar, ocultar y dar formato a la cifra correspondiente a la métrica que se muestra en el centro (<em>Formato > Valor de globo</em>), así como mostrar u ocultar las cifras que se muestran en los extremos de la visualización con los valores mínimo y máximo a representar (<em>Formato > Etiquetas de datos</em>).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-e6431c98-5391-426f-8147-d255f14839af') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>gauge</strong>, <strong>medidor</strong> o <strong>gráfico indicador</strong> es especialmente útil si queremos mostrar un valor comparándolo con otro que se considera valor objetivo. Su panel de campos es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_01.jpg"></a>
En este tipo de visualizaciones trabajamos con un valor numérico simple y con un valor objetivo. Adicionalmente podremos limitar el valor mínimo y valor máximo a mostrar en el indicador.
<ul><li>Campo “<em>Valor</em>”: recibirá el valor numérico simple a mostrar. Solo admite uno.</li>
<li>Campo “<em>Valor mínimo</em>”: recibirá el campo que determinará el valor mínimo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Min.</em>”).</li>
<li>Campo “<em>Valor máximo</em>”: recibirá el campo que determinará el valor máximo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Máx.</em>”).</li>
<li>Campo “<em>Valor de destino</em>”: recibirá el campo que determinará el valor objetivo a mostrar en la visualización por medio de una barra (roja por defecto). Al igual que ocurre con los dos campos anteriores, si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Destino</em>”).</li>
<li>Campo “<em>Información sobre herramientas</em>”: recibirá campos cuyo contenido queremos que se muestre en la ventana emergente que se abre al mover el ratón por encima del indicador.</li>
</ul>Los campos <em>Valor mínimo</em>, <em>Valor máximo</em> y <em>Valor de destino</em> solo pueden introducirse en el panel de configuración o en el de opciones, nunca en ambos al mismo tiempo. Es necesario comentar también que la sección <em>Eje medidor</em> del panel de formato no se muestra hasta que no se lleva algún campo al panel de campos de la visualización.
Llevemos, por ejemplo, la medida <em>Sales</em> (conteniendo la suma de los importes de ventas) al campo <em>Valor</em> de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_02.jpg"></a>
Cuando creamos la visualización, el valor máximo toma siempre, por defecto, un valor igual al doble de la cifra mostrada en el medidor. Una vez introduzcamos un valor o una medida en el campo “<em>Valor máximo</em>”, la visualización se adaptará adecuadamente. El valor mínimo, por defecto, es cero.
Ahora podemos llevar campos o medidas de nuestro modelo de datos a los campos adecuados de la visualización para definir el valor objetivo y los valores mínimo y máximo. Por ejemplo, escribamos en <em>Formato > Eje medidor</em> las cifras 2000000 (2 millones) para el valor mínimo, 12000000 (12 millones) para el valor máximo, y 10000000 (10 millones) para el destino:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_03.jpg"></a>
La visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_04.jpg"></a>
Comprobamos que los límites del gráfico son los valores mínimo y máximo que hemos fijado, y que se muestra con una barra roja el objetivo. Si el valor máximo fuese inferior al valor de la métrica, se mostraría todo el indicador de color naranja. Por ejemplo, en la siguiente imagen se ha llevado el valor 5000000 (5 millones) -valor inferior a los 8 millones de ventas- al campo <em>Max.</em> de la sección <em>Formato > Eje medidor</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_06.jpg"></a>
Una limitación de esta visualización es que el color naranja que indica el valor de la métrica, aunque puede personalizarse, no cambia cuando se alcanza el objetivo.
Al mover el cursor por encima de la visualización se muestra la clásica ventana emergente con la información correspondiente, aunque en ésta no se incluye información sobre el objetivo, tan solo sobre la métrica que hayamos llevado al campo <em>Valor</em> (y sobre los campos que hayamos llevado a <em>Información sobre herramientas</em>). En el ejemplo de la siguiente imagen se ha llevado la medida <em>Units</em> (conteniendo el número de unidades vendidas) a dicho campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_05.jpg"></a>
Comentar, por último, que la visualización nos permite escoger -como ya se ha adelantado- el color que representa la métrica siendo mostrada (el naranja de las anteriores imágenes) y el color de la barrita que representa el objetivo (rojo por defecto), ambas opciones personalizables en <em>Formato > Colores de datos</em>. Podemos también mostrar, ocultar y dar formato a la cifra correspondiente a la métrica que se muestra en el centro (<em>Formato > Valor de globo</em>), así como mostrar u ocultar las cifras que se muestran en los extremos de la visualización con los valores mínimo y máximo a representar (<em>Formato > Etiquetas de datos</em>).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-9da6ae6e-120a-421d-a37d-f022ab43ca78') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>gauge</strong>, <strong>medidor</strong> o <strong>gráfico indicador</strong> es especialmente útil si queremos mostrar un valor comparándolo con otro que se considera valor objetivo. Su panel de campos es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_01.jpg"></a>
En este tipo de visualizaciones trabajamos con un valor numérico simple y con un valor objetivo. Adicionalmente podremos limitar el valor mínimo y valor máximo a mostrar en el indicador.
<ul><li>Campo “<em>Valor</em>”: recibirá el valor numérico simple a mostrar. Solo admite uno.</li>
<li>Campo “<em>Valor mínimo</em>”: recibirá el campo que determinará el valor mínimo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Min.</em>”).</li>
<li>Campo “<em>Valor máximo</em>”: recibirá el campo que determinará el valor máximo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Máx.</em>”).</li>
<li>Campo “<em>Valor de destino</em>”: recibirá el campo que determinará el valor objetivo a mostrar en la visualización por medio de una barra (roja por defecto). Al igual que ocurre con los dos campos anteriores, si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Destino</em>”).</li>
<li>Campo “<em>Información sobre herramientas</em>”: recibirá campos cuyo contenido queremos que se muestre en la ventana emergente que se abre al mover el ratón por encima del indicador.</li>
</ul>Los campos <em>Valor mínimo</em>, <em>Valor máximo</em> y <em>Valor de destino</em> solo pueden introducirse en el panel de configuración o en el de opciones, nunca en ambos al mismo tiempo. Es necesario comentar también que la sección <em>Eje medidor</em> del panel de formato no se muestra hasta que no se lleva algún campo al panel de campos de la visualización.
Llevemos, por ejemplo, la medida <em>Sales</em> (conteniendo la suma de los importes de ventas) al campo <em>Valor</em> de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_02.jpg"></a>
Cuando creamos la visualización, el valor máximo toma siempre, por defecto, un valor igual al doble de la cifra mostrada en el medidor. Una vez introduzcamos un valor o una medida en el campo “<em>Valor máximo</em>”, la visualización se adaptará adecuadamente. El valor mínimo, por defecto, es cero.
Ahora podemos llevar campos o medidas de nuestro modelo de datos a los campos adecuados de la visualización para definir el valor objetivo y los valores mínimo y máximo. Por ejemplo, escribamos en <em>Formato > Eje medidor</em> las cifras 2000000 (2 millones) para el valor mínimo, 12000000 (12 millones) para el valor máximo, y 10000000 (10 millones) para el destino:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_03.jpg"></a>
La visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_04.jpg"></a>
Comprobamos que los límites del gráfico son los valores mínimo y máximo que hemos fijado, y que se muestra con una barra roja el objetivo. Si el valor máximo fuese inferior al valor de la métrica, se mostraría todo el indicador de color naranja. Por ejemplo, en la siguiente imagen se ha llevado el valor 5000000 (5 millones) -valor inferior a los 8 millones de ventas- al campo <em>Max.</em> de la sección <em>Formato > Eje medidor</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_06.jpg"></a>
Una limitación de esta visualización es que el color naranja que indica el valor de la métrica, aunque puede personalizarse, no cambia cuando se alcanza el objetivo.
Al mover el cursor por encima de la visualización se muestra la clásica ventana emergente con la información correspondiente, aunque en ésta no se incluye información sobre el objetivo, tan solo sobre la métrica que hayamos llevado al campo <em>Valor</em> (y sobre los campos que hayamos llevado a <em>Información sobre herramientas</em>). En el ejemplo de la siguiente imagen se ha llevado la medida <em>Units</em> (conteniendo el número de unidades vendidas) a dicho campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_05.jpg"></a>
Comentar, por último, que la visualización nos permite escoger -como ya se ha adelantado- el color que representa la métrica siendo mostrada (el naranja de las anteriores imágenes) y el color de la barrita que representa el objetivo (rojo por defecto), ambas opciones personalizables en <em>Formato > Colores de datos</em>. Podemos también mostrar, ocultar y dar formato a la cifra correspondiente a la métrica que se muestra en el centro (<em>Formato > Valor de globo</em>), así como mostrar u ocultar las cifras que se muestran en los extremos de la visualización con los valores mínimo y máximo a representar (<em>Formato > Etiquetas de datos</em>).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-9da6ae6e-120a-421d-a37d-f022ab43ca78') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>gauge</strong>, <strong>medidor</strong> o <strong>gráfico indicador</strong> es especialmente útil si queremos mostrar un valor comparándolo con otro que se considera valor objetivo. Su panel de campos es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_01.jpg"></a>
En este tipo de visualizaciones trabajamos con un valor numérico simple y con un valor objetivo. Adicionalmente podremos limitar el valor mínimo y valor máximo a mostrar en el indicador.
<ul><li>Campo “<em>Valor</em>”: recibirá el valor numérico simple a mostrar. Solo admite uno.</li>
<li>Campo “<em>Valor mínimo</em>”: recibirá el campo que determinará el valor mínimo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Min.</em>”).</li>
<li>Campo “<em>Valor máximo</em>”: recibirá el campo que determinará el valor máximo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Máx.</em>”).</li>
<li>Campo “<em>Valor de destino</em>”: recibirá el campo que determinará el valor objetivo a mostrar en la visualización por medio de una barra (roja por defecto). Al igual que ocurre con los dos campos anteriores, si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Destino</em>”).</li>
<li>Campo “<em>Información sobre herramientas</em>”: recibirá campos cuyo contenido queremos que se muestre en la ventana emergente que se abre al mover el ratón por encima del indicador.</li>
</ul>Los campos <em>Valor mínimo</em>, <em>Valor máximo</em> y <em>Valor de destino</em> solo pueden introducirse en el panel de configuración o en el de opciones, nunca en ambos al mismo tiempo. Es necesario comentar también que la sección <em>Eje medidor</em> del panel de formato no se muestra hasta que no se lleva algún campo al panel de campos de la visualización.
Llevemos, por ejemplo, la medida <em>Sales</em> (conteniendo la suma de los importes de ventas) al campo <em>Valor</em> de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_02.jpg"></a>
Cuando creamos la visualización, el valor máximo toma siempre, por defecto, un valor igual al doble de la cifra mostrada en el medidor. Una vez introduzcamos un valor o una medida en el campo “<em>Valor máximo</em>”, la visualización se adaptará adecuadamente. El valor mínimo, por defecto, es cero.
Ahora podemos llevar campos o medidas de nuestro modelo de datos a los campos adecuados de la visualización para definir el valor objetivo y los valores mínimo y máximo. Por ejemplo, escribamos en <em>Formato > Eje medidor</em> las cifras 2000000 (2 millones) para el valor mínimo, 12000000 (12 millones) para el valor máximo, y 10000000 (10 millones) para el destino:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_03.jpg"></a>
La visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_04.jpg"></a>
Comprobamos que los límites del gráfico son los valores mínimo y máximo que hemos fijado, y que se muestra con una barra roja el objetivo. Si el valor máximo fuese inferior al valor de la métrica, se mostraría todo el indicador de color naranja. Por ejemplo, en la siguiente imagen se ha llevado el valor 5000000 (5 millones) -valor inferior a los 8 millones de ventas- al campo <em>Max.</em> de la sección <em>Formato > Eje medidor</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_06.jpg"></a>
Una limitación de esta visualización es que el color naranja que indica el valor de la métrica, aunque puede personalizarse, no cambia cuando se alcanza el objetivo.
Al mover el cursor por encima de la visualización se muestra la clásica ventana emergente con la información correspondiente, aunque en ésta no se incluye información sobre el objetivo, tan solo sobre la métrica que hayamos llevado al campo <em>Valor</em> (y sobre los campos que hayamos llevado a <em>Información sobre herramientas</em>). En el ejemplo de la siguiente imagen se ha llevado la medida <em>Units</em> (conteniendo el número de unidades vendidas) a dicho campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_05.jpg"></a>
Comentar, por último, que la visualización nos permite escoger -como ya se ha adelantado- el color que representa la métrica siendo mostrada (el naranja de las anteriores imágenes) y el color de la barrita que representa el objetivo (rojo por defecto), ambas opciones personalizables en <em>Formato > Colores de datos</em>. Podemos también mostrar, ocultar y dar formato a la cifra correspondiente a la métrica que se muestra en el centro (<em>Formato > Valor de globo</em>), así como mostrar u ocultar las cifras que se muestran en los extremos de la visualización con los valores mínimo y máximo a representar (<em>Formato > Etiquetas de datos</em>).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-9da6ae6e-120a-421d-a37d-f022ab43ca78') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>gauge</strong>, <strong>medidor</strong> o <strong>gráfico indicador</strong> es especialmente útil si queremos mostrar un valor comparándolo con otro que se considera valor objetivo. Su panel de campos es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_01.jpg"></a>
En este tipo de visualizaciones trabajamos con un valor numérico simple y con un valor objetivo. Adicionalmente podremos limitar el valor mínimo y valor máximo a mostrar en el indicador.
<ul><li>Campo “<em>Valor</em>”: recibirá el valor numérico simple a mostrar. Solo admite uno.</li>
<li>Campo “<em>Valor mínimo</em>”: recibirá el campo que determinará el valor mínimo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Min.</em>”).</li>
<li>Campo “<em>Valor máximo</em>”: recibirá el campo que determinará el valor máximo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Máx.</em>”).</li>
<li>Campo “<em>Valor de destino</em>”: recibirá el campo que determinará el valor objetivo a mostrar en la visualización por medio de una barra (roja por defecto). Al igual que ocurre con los dos campos anteriores, si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Destino</em>”).</li>
<li>Campo “<em>Información sobre herramientas</em>”: recibirá campos cuyo contenido queremos que se muestre en la ventana emergente que se abre al mover el ratón por encima del indicador.</li>
</ul>Los campos <em>Valor mínimo</em>, <em>Valor máximo</em> y <em>Valor de destino</em> solo pueden introducirse en el panel de configuración o en el de opciones, nunca en ambos al mismo tiempo. Es necesario comentar también que la sección <em>Eje medidor</em> del panel de formato no se muestra hasta que no se lleva algún campo al panel de campos de la visualización.
Llevemos, por ejemplo, la medida <em>Sales</em> (conteniendo la suma de los importes de ventas) al campo <em>Valor</em> de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_02.jpg"></a>
Cuando creamos la visualización, el valor máximo toma siempre, por defecto, un valor igual al doble de la cifra mostrada en el medidor. Una vez introduzcamos un valor o una medida en el campo “<em>Valor máximo</em>”, la visualización se adaptará adecuadamente. El valor mínimo, por defecto, es cero.
Ahora podemos llevar campos o medidas de nuestro modelo de datos a los campos adecuados de la visualización para definir el valor objetivo y los valores mínimo y máximo. Por ejemplo, escribamos en <em>Formato > Eje medidor</em> las cifras 2000000 (2 millones) para el valor mínimo, 12000000 (12 millones) para el valor máximo, y 10000000 (10 millones) para el destino:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_03.jpg"></a>
La visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_04.jpg"></a>
Comprobamos que los límites del gráfico son los valores mínimo y máximo que hemos fijado, y que se muestra con una barra roja el objetivo. Si el valor máximo fuese inferior al valor de la métrica, se mostraría todo el indicador de color naranja. Por ejemplo, en la siguiente imagen se ha llevado el valor 5000000 (5 millones) -valor inferior a los 8 millones de ventas- al campo <em>Max.</em> de la sección <em>Formato > Eje medidor</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_06.jpg"></a>
Una limitación de esta visualización es que el color naranja que indica el valor de la métrica, aunque puede personalizarse, no cambia cuando se alcanza el objetivo.
Al mover el cursor por encima de la visualización se muestra la clásica ventana emergente con la información correspondiente, aunque en ésta no se incluye información sobre el objetivo, tan solo sobre la métrica que hayamos llevado al campo <em>Valor</em> (y sobre los campos que hayamos llevado a <em>Información sobre herramientas</em>). En el ejemplo de la siguiente imagen se ha llevado la medida <em>Units</em> (conteniendo el número de unidades vendidas) a dicho campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_05.jpg"></a>
Comentar, por último, que la visualización nos permite escoger -como ya se ha adelantado- el color que representa la métrica siendo mostrada (el naranja de las anteriores imágenes) y el color de la barrita que representa el objetivo (rojo por defecto), ambas opciones personalizables en <em>Formato > Colores de datos</em>. Podemos también mostrar, ocultar y dar formato a la cifra correspondiente a la métrica que se muestra en el centro (<em>Formato > Valor de globo</em>), así como mostrar u ocultar las cifras que se muestran en los extremos de la visualización con los valores mínimo y máximo a representar (<em>Formato > Etiquetas de datos</em>).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-9da6ae6e-120a-421d-a37d-f022ab43ca78') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>gauge</strong>, <strong>medidor</strong> o <strong>gráfico indicador</strong> es especialmente útil si queremos mostrar un valor comparándolo con otro que se considera valor objetivo. Su panel de campos es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_01.jpg"></a>
En este tipo de visualizaciones trabajamos con un valor numérico simple y con un valor objetivo. Adicionalmente podremos limitar el valor mínimo y valor máximo a mostrar en el indicador.
<ul><li>Campo “<em>Valor</em>”: recibirá el valor numérico simple a mostrar. Solo admite uno.</li>
<li>Campo “<em>Valor mínimo</em>”: recibirá el campo que determinará el valor mínimo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Min.</em>”).</li>
<li>Campo “<em>Valor máximo</em>”: recibirá el campo que determinará el valor máximo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Máx.</em>”).</li>
<li>Campo “<em>Valor de destino</em>”: recibirá el campo que determinará el valor objetivo a mostrar en la visualización por medio de una barra (roja por defecto). Al igual que ocurre con los dos campos anteriores, si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Destino</em>”).</li>
<li>Campo “<em>Información sobre herramientas</em>”: recibirá campos cuyo contenido queremos que se muestre en la ventana emergente que se abre al mover el ratón por encima del indicador.</li>
</ul>Los campos <em>Valor mínimo</em>, <em>Valor máximo</em> y <em>Valor de destino</em> solo pueden introducirse en el panel de configuración o en el de opciones, nunca en ambos al mismo tiempo. Es necesario comentar también que la sección <em>Eje medidor</em> del panel de formato no se muestra hasta que no se lleva algún campo al panel de campos de la visualización.
Llevemos, por ejemplo, la medida <em>Sales</em> (conteniendo la suma de los importes de ventas) al campo <em>Valor</em> de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_02.jpg"></a>
Cuando creamos la visualización, el valor máximo toma siempre, por defecto, un valor igual al doble de la cifra mostrada en el medidor. Una vez introduzcamos un valor o una medida en el campo “<em>Valor máximo</em>”, la visualización se adaptará adecuadamente. El valor mínimo, por defecto, es cero.
Ahora podemos llevar campos o medidas de nuestro modelo de datos a los campos adecuados de la visualización para definir el valor objetivo y los valores mínimo y máximo. Por ejemplo, escribamos en <em>Formato > Eje medidor</em> las cifras 2000000 (2 millones) para el valor mínimo, 12000000 (12 millones) para el valor máximo, y 10000000 (10 millones) para el destino:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_03.jpg"></a>
La visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_04.jpg"></a>
Comprobamos que los límites del gráfico son los valores mínimo y máximo que hemos fijado, y que se muestra con una barra roja el objetivo. Si el valor máximo fuese inferior al valor de la métrica, se mostraría todo el indicador de color naranja. Por ejemplo, en la siguiente imagen se ha llevado el valor 5000000 (5 millones) -valor inferior a los 8 millones de ventas- al campo <em>Max.</em> de la sección <em>Formato > Eje medidor</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_06.jpg"></a>
Una limitación de esta visualización es que el color naranja que indica el valor de la métrica, aunque puede personalizarse, no cambia cuando se alcanza el objetivo.
Al mover el cursor por encima de la visualización se muestra la clásica ventana emergente con la información correspondiente, aunque en ésta no se incluye información sobre el objetivo, tan solo sobre la métrica que hayamos llevado al campo <em>Valor</em> (y sobre los campos que hayamos llevado a <em>Información sobre herramientas</em>). En el ejemplo de la siguiente imagen se ha llevado la medida <em>Units</em> (conteniendo el número de unidades vendidas) a dicho campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_05.jpg"></a>
Comentar, por último, que la visualización nos permite escoger -como ya se ha adelantado- el color que representa la métrica siendo mostrada (el naranja de las anteriores imágenes) y el color de la barrita que representa el objetivo (rojo por defecto), ambas opciones personalizables en <em>Formato > Colores de datos</em>. Podemos también mostrar, ocultar y dar formato a la cifra correspondiente a la métrica que se muestra en el centro (<em>Formato > Valor de globo</em>), así como mostrar u ocultar las cifras que se muestran en los extremos de la visualización con los valores mínimo y máximo a representar (<em>Formato > Etiquetas de datos</em>).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-94ec66df-2733-492f-822b-76ade4475468') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>gauge</strong>, <strong>medidor</strong> o <strong>gráfico indicador</strong> es especialmente útil si queremos mostrar un valor comparándolo con otro que se considera valor objetivo. Su panel de campos es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_01.jpg"></a>
En este tipo de visualizaciones trabajamos con un valor numérico simple y con un valor objetivo. Adicionalmente podremos limitar el valor mínimo y valor máximo a mostrar en el indicador.
<ul><li>Campo “<em>Valor</em>”: recibirá el valor numérico simple a mostrar. Solo admite uno.</li>
<li>Campo “<em>Valor mínimo</em>”: recibirá el campo que determinará el valor mínimo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Min.</em>”).</li>
<li>Campo “<em>Valor máximo</em>”: recibirá el campo que determinará el valor máximo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Máx.</em>”).</li>
<li>Campo “<em>Valor de destino</em>”: recibirá el campo que determinará el valor objetivo a mostrar en la visualización por medio de una barra (roja por defecto). Al igual que ocurre con los dos campos anteriores, si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Destino</em>”).</li>
<li>Campo “<em>Información sobre herramientas</em>”: recibirá campos cuyo contenido queremos que se muestre en la ventana emergente que se abre al mover el ratón por encima del indicador.</li>
</ul>Los campos <em>Valor mínimo</em>, <em>Valor máximo</em> y <em>Valor de destino</em> solo pueden introducirse en el panel de configuración o en el de opciones, nunca en ambos al mismo tiempo. Es necesario comentar también que la sección <em>Eje medidor</em> del panel de formato no se muestra hasta que no se lleva algún campo al panel de campos de la visualización.
Llevemos, por ejemplo, la medida <em>Sales</em> (conteniendo la suma de los importes de ventas) al campo <em>Valor</em> de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_02.jpg"></a>
Cuando creamos la visualización, el valor máximo toma siempre, por defecto, un valor igual al doble de la cifra mostrada en el medidor. Una vez introduzcamos un valor o una medida en el campo “<em>Valor máximo</em>”, la visualización se adaptará adecuadamente. El valor mínimo, por defecto, es cero.
Ahora podemos llevar campos o medidas de nuestro modelo de datos a los campos adecuados de la visualización para definir el valor objetivo y los valores mínimo y máximo. Por ejemplo, escribamos en <em>Formato > Eje medidor</em> las cifras 2000000 (2 millones) para el valor mínimo, 12000000 (12 millones) para el valor máximo, y 10000000 (10 millones) para el destino:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_03.jpg"></a>
La visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_04.jpg"></a>
Comprobamos que los límites del gráfico son los valores mínimo y máximo que hemos fijado, y que se muestra con una barra roja el objetivo. Si el valor máximo fuese inferior al valor de la métrica, se mostraría todo el indicador de color naranja. Por ejemplo, en la siguiente imagen se ha llevado el valor 5000000 (5 millones) -valor inferior a los 8 millones de ventas- al campo <em>Max.</em> de la sección <em>Formato > Eje medidor</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_06.jpg"></a>
Una limitación de esta visualización es que el color naranja que indica el valor de la métrica, aunque puede personalizarse, no cambia cuando se alcanza el objetivo.
Al mover el cursor por encima de la visualización se muestra la clásica ventana emergente con la información correspondiente, aunque en ésta no se incluye información sobre el objetivo, tan solo sobre la métrica que hayamos llevado al campo <em>Valor</em> (y sobre los campos que hayamos llevado a <em>Información sobre herramientas</em>). En el ejemplo de la siguiente imagen se ha llevado la medida <em>Units</em> (conteniendo el número de unidades vendidas) a dicho campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_05.jpg"></a>
Comentar, por último, que la visualización nos permite escoger -como ya se ha adelantado- el color que representa la métrica siendo mostrada (el naranja de las anteriores imágenes) y el color de la barrita que representa el objetivo (rojo por defecto), ambas opciones personalizables en <em>Formato > Colores de datos</em>. Podemos también mostrar, ocultar y dar formato a la cifra correspondiente a la métrica que se muestra en el centro (<em>Formato > Valor de globo</em>), así como mostrar u ocultar las cifras que se muestran en los extremos de la visualización con los valores mínimo y máximo a representar (<em>Formato > Etiquetas de datos</em>).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-94ec66df-2733-492f-822b-76ade4475468') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>gauge</strong>, <strong>medidor</strong> o <strong>gráfico indicador</strong> es especialmente útil si queremos mostrar un valor comparándolo con otro que se considera valor objetivo. Su panel de campos es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_01.jpg"></a>
En este tipo de visualizaciones trabajamos con un valor numérico simple y con un valor objetivo. Adicionalmente podremos limitar el valor mínimo y valor máximo a mostrar en el indicador.
<ul><li>Campo “<em>Valor</em>”: recibirá el valor numérico simple a mostrar. Solo admite uno.</li>
<li>Campo “<em>Valor mínimo</em>”: recibirá el campo que determinará el valor mínimo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Min.</em>”).</li>
<li>Campo “<em>Valor máximo</em>”: recibirá el campo que determinará el valor máximo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Máx.</em>”).</li>
<li>Campo “<em>Valor de destino</em>”: recibirá el campo que determinará el valor objetivo a mostrar en la visualización por medio de una barra (roja por defecto). Al igual que ocurre con los dos campos anteriores, si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Destino</em>”).</li>
<li>Campo “<em>Información sobre herramientas</em>”: recibirá campos cuyo contenido queremos que se muestre en la ventana emergente que se abre al mover el ratón por encima del indicador.</li>
</ul>Los campos <em>Valor mínimo</em>, <em>Valor máximo</em> y <em>Valor de destino</em> solo pueden introducirse en el panel de configuración o en el de opciones, nunca en ambos al mismo tiempo. Es necesario comentar también que la sección <em>Eje medidor</em> del panel de formato no se muestra hasta que no se lleva algún campo al panel de campos de la visualización.
Llevemos, por ejemplo, la medida <em>Sales</em> (conteniendo la suma de los importes de ventas) al campo <em>Valor</em> de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_02.jpg"></a>
Cuando creamos la visualización, el valor máximo toma siempre, por defecto, un valor igual al doble de la cifra mostrada en el medidor. Una vez introduzcamos un valor o una medida en el campo “<em>Valor máximo</em>”, la visualización se adaptará adecuadamente. El valor mínimo, por defecto, es cero.
Ahora podemos llevar campos o medidas de nuestro modelo de datos a los campos adecuados de la visualización para definir el valor objetivo y los valores mínimo y máximo. Por ejemplo, escribamos en <em>Formato > Eje medidor</em> las cifras 2000000 (2 millones) para el valor mínimo, 12000000 (12 millones) para el valor máximo, y 10000000 (10 millones) para el destino:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_03.jpg"></a>
La visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_04.jpg"></a>
Comprobamos que los límites del gráfico son los valores mínimo y máximo que hemos fijado, y que se muestra con una barra roja el objetivo. Si el valor máximo fuese inferior al valor de la métrica, se mostraría todo el indicador de color naranja. Por ejemplo, en la siguiente imagen se ha llevado el valor 5000000 (5 millones) -valor inferior a los 8 millones de ventas- al campo <em>Max.</em> de la sección <em>Formato > Eje medidor</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_06.jpg"></a>
Una limitación de esta visualización es que el color naranja que indica el valor de la métrica, aunque puede personalizarse, no cambia cuando se alcanza el objetivo.
Al mover el cursor por encima de la visualización se muestra la clásica ventana emergente con la información correspondiente, aunque en ésta no se incluye información sobre el objetivo, tan solo sobre la métrica que hayamos llevado al campo <em>Valor</em> (y sobre los campos que hayamos llevado a <em>Información sobre herramientas</em>). En el ejemplo de la siguiente imagen se ha llevado la medida <em>Units</em> (conteniendo el número de unidades vendidas) a dicho campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_05.jpg"></a>
Comentar, por último, que la visualización nos permite escoger -como ya se ha adelantado- el color que representa la métrica siendo mostrada (el naranja de las anteriores imágenes) y el color de la barrita que representa el objetivo (rojo por defecto), ambas opciones personalizables en <em>Formato > Colores de datos</em>. Podemos también mostrar, ocultar y dar formato a la cifra correspondiente a la métrica que se muestra en el centro (<em>Formato > Valor de globo</em>), así como mostrar u ocultar las cifras que se muestran en los extremos de la visualización con los valores mínimo y máximo a representar (<em>Formato > Etiquetas de datos</em>).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-94ec66df-2733-492f-822b-76ade4475468') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>gauge</strong>, <strong>medidor</strong> o <strong>gráfico indicador</strong> es especialmente útil si queremos mostrar un valor comparándolo con otro que se considera valor objetivo. Su panel de campos es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_01.jpg"></a>
En este tipo de visualizaciones trabajamos con un valor numérico simple y con un valor objetivo. Adicionalmente podremos limitar el valor mínimo y valor máximo a mostrar en el indicador.
<ul><li>Campo “<em>Valor</em>”: recibirá el valor numérico simple a mostrar. Solo admite uno.</li>
<li>Campo “<em>Valor mínimo</em>”: recibirá el campo que determinará el valor mínimo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Min.</em>”).</li>
<li>Campo “<em>Valor máximo</em>”: recibirá el campo que determinará el valor máximo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Máx.</em>”).</li>
<li>Campo “<em>Valor de destino</em>”: recibirá el campo que determinará el valor objetivo a mostrar en la visualización por medio de una barra (roja por defecto). Al igual que ocurre con los dos campos anteriores, si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Destino</em>”).</li>
<li>Campo “<em>Información sobre herramientas</em>”: recibirá campos cuyo contenido queremos que se muestre en la ventana emergente que se abre al mover el ratón por encima del indicador.</li>
</ul>Los campos <em>Valor mínimo</em>, <em>Valor máximo</em> y <em>Valor de destino</em> solo pueden introducirse en el panel de configuración o en el de opciones, nunca en ambos al mismo tiempo. Es necesario comentar también que la sección <em>Eje medidor</em> del panel de formato no se muestra hasta que no se lleva algún campo al panel de campos de la visualización.
Llevemos, por ejemplo, la medida <em>Sales</em> (conteniendo la suma de los importes de ventas) al campo <em>Valor</em> de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_02.jpg"></a>
Cuando creamos la visualización, el valor máximo toma siempre, por defecto, un valor igual al doble de la cifra mostrada en el medidor. Una vez introduzcamos un valor o una medida en el campo “<em>Valor máximo</em>”, la visualización se adaptará adecuadamente. El valor mínimo, por defecto, es cero.
Ahora podemos llevar campos o medidas de nuestro modelo de datos a los campos adecuados de la visualización para definir el valor objetivo y los valores mínimo y máximo. Por ejemplo, escribamos en <em>Formato > Eje medidor</em> las cifras 2000000 (2 millones) para el valor mínimo, 12000000 (12 millones) para el valor máximo, y 10000000 (10 millones) para el destino:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_03.jpg"></a>
La visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_04.jpg"></a>
Comprobamos que los límites del gráfico son los valores mínimo y máximo que hemos fijado, y que se muestra con una barra roja el objetivo. Si el valor máximo fuese inferior al valor de la métrica, se mostraría todo el indicador de color naranja. Por ejemplo, en la siguiente imagen se ha llevado el valor 5000000 (5 millones) -valor inferior a los 8 millones de ventas- al campo <em>Max.</em> de la sección <em>Formato > Eje medidor</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_06.jpg"></a>
Una limitación de esta visualización es que el color naranja que indica el valor de la métrica, aunque puede personalizarse, no cambia cuando se alcanza el objetivo.
Al mover el cursor por encima de la visualización se muestra la clásica ventana emergente con la información correspondiente, aunque en ésta no se incluye información sobre el objetivo, tan solo sobre la métrica que hayamos llevado al campo <em>Valor</em> (y sobre los campos que hayamos llevado a <em>Información sobre herramientas</em>). En el ejemplo de la siguiente imagen se ha llevado la medida <em>Units</em> (conteniendo el número de unidades vendidas) a dicho campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_05.jpg"></a>
Comentar, por último, que la visualización nos permite escoger -como ya se ha adelantado- el color que representa la métrica siendo mostrada (el naranja de las anteriores imágenes) y el color de la barrita que representa el objetivo (rojo por defecto), ambas opciones personalizables en <em>Formato > Colores de datos</em>. Podemos también mostrar, ocultar y dar formato a la cifra correspondiente a la métrica que se muestra en el centro (<em>Formato > Valor de globo</em>), así como mostrar u ocultar las cifras que se muestran en los extremos de la visualización con los valores mínimo y máximo a representar (<em>Formato > Etiquetas de datos</em>).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-94ec66df-2733-492f-822b-76ade4475468') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>gauge</strong>, <strong>medidor</strong> o <strong>gráfico indicador</strong> es especialmente útil si queremos mostrar un valor comparándolo con otro que se considera valor objetivo. Su panel de campos es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_01.jpg"></a>
En este tipo de visualizaciones trabajamos con un valor numérico simple y con un valor objetivo. Adicionalmente podremos limitar el valor mínimo y valor máximo a mostrar en el indicador.
<ul><li>Campo “<em>Valor</em>”: recibirá el valor numérico simple a mostrar. Solo admite uno.</li>
<li>Campo “<em>Valor mínimo</em>”: recibirá el campo que determinará el valor mínimo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Min.</em>”).</li>
<li>Campo “<em>Valor máximo</em>”: recibirá el campo que determinará el valor máximo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Máx.</em>”).</li>
<li>Campo “<em>Valor de destino</em>”: recibirá el campo que determinará el valor objetivo a mostrar en la visualización por medio de una barra (roja por defecto). Al igual que ocurre con los dos campos anteriores, si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Destino</em>”).</li>
<li>Campo “<em>Información sobre herramientas</em>”: recibirá campos cuyo contenido queremos que se muestre en la ventana emergente que se abre al mover el ratón por encima del indicador.</li>
</ul>Los campos <em>Valor mínimo</em>, <em>Valor máximo</em> y <em>Valor de destino</em> solo pueden introducirse en el panel de configuración o en el de opciones, nunca en ambos al mismo tiempo. Es necesario comentar también que la sección <em>Eje medidor</em> del panel de formato no se muestra hasta que no se lleva algún campo al panel de campos de la visualización.
Llevemos, por ejemplo, la medida <em>Sales</em> (conteniendo la suma de los importes de ventas) al campo <em>Valor</em> de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_02.jpg"></a>
Cuando creamos la visualización, el valor máximo toma siempre, por defecto, un valor igual al doble de la cifra mostrada en el medidor. Una vez introduzcamos un valor o una medida en el campo “<em>Valor máximo</em>”, la visualización se adaptará adecuadamente. El valor mínimo, por defecto, es cero.
Ahora podemos llevar campos o medidas de nuestro modelo de datos a los campos adecuados de la visualización para definir el valor objetivo y los valores mínimo y máximo. Por ejemplo, escribamos en <em>Formato > Eje medidor</em> las cifras 2000000 (2 millones) para el valor mínimo, 12000000 (12 millones) para el valor máximo, y 10000000 (10 millones) para el destino:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_03.jpg"></a>
La visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_04.jpg"></a>
Comprobamos que los límites del gráfico son los valores mínimo y máximo que hemos fijado, y que se muestra con una barra roja el objetivo. Si el valor máximo fuese inferior al valor de la métrica, se mostraría todo el indicador de color naranja. Por ejemplo, en la siguiente imagen se ha llevado el valor 5000000 (5 millones) -valor inferior a los 8 millones de ventas- al campo <em>Max.</em> de la sección <em>Formato > Eje medidor</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_06.jpg"></a>
Una limitación de esta visualización es que el color naranja que indica el valor de la métrica, aunque puede personalizarse, no cambia cuando se alcanza el objetivo.
Al mover el cursor por encima de la visualización se muestra la clásica ventana emergente con la información correspondiente, aunque en ésta no se incluye información sobre el objetivo, tan solo sobre la métrica que hayamos llevado al campo <em>Valor</em> (y sobre los campos que hayamos llevado a <em>Información sobre herramientas</em>). En el ejemplo de la siguiente imagen se ha llevado la medida <em>Units</em> (conteniendo el número de unidades vendidas) a dicho campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_05.jpg"></a>
Comentar, por último, que la visualización nos permite escoger -como ya se ha adelantado- el color que representa la métrica siendo mostrada (el naranja de las anteriores imágenes) y el color de la barrita que representa el objetivo (rojo por defecto), ambas opciones personalizables en <em>Formato > Colores de datos</em>. Podemos también mostrar, ocultar y dar formato a la cifra correspondiente a la métrica que se muestra en el centro (<em>Formato > Valor de globo</em>), así como mostrar u ocultar las cifras que se muestran en los extremos de la visualización con los valores mínimo y máximo a representar (<em>Formato > Etiquetas de datos</em>).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-76fb27f2-ec1a-4f33-90c1-96dce3848c6d') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>gauge</strong>, <strong>medidor</strong> o <strong>gráfico indicador</strong> es especialmente útil si queremos mostrar un valor comparándolo con otro que se considera valor objetivo. Su panel de campos es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_01.jpg"></a>
En este tipo de visualizaciones trabajamos con un valor numérico simple y con un valor objetivo. Adicionalmente podremos limitar el valor mínimo y valor máximo a mostrar en el indicador.
<ul><li>Campo “<em>Valor</em>”: recibirá el valor numérico simple a mostrar. Solo admite uno.</li>
<li>Campo “<em>Valor mínimo</em>”: recibirá el campo que determinará el valor mínimo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Min.</em>”).</li>
<li>Campo “<em>Valor máximo</em>”: recibirá el campo que determinará el valor máximo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Máx.</em>”).</li>
<li>Campo “<em>Valor de destino</em>”: recibirá el campo que determinará el valor objetivo a mostrar en la visualización por medio de una barra (roja por defecto). Al igual que ocurre con los dos campos anteriores, si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Destino</em>”).</li>
<li>Campo “<em>Información sobre herramientas</em>”: recibirá campos cuyo contenido queremos que se muestre en la ventana emergente que se abre al mover el ratón por encima del indicador.</li>
</ul>Los campos <em>Valor mínimo</em>, <em>Valor máximo</em> y <em>Valor de destino</em> solo pueden introducirse en el panel de configuración o en el de opciones, nunca en ambos al mismo tiempo. Es necesario comentar también que la sección <em>Eje medidor</em> del panel de formato no se muestra hasta que no se lleva algún campo al panel de campos de la visualización.
Llevemos, por ejemplo, la medida <em>Sales</em> (conteniendo la suma de los importes de ventas) al campo <em>Valor</em> de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_02.jpg"></a>
Cuando creamos la visualización, el valor máximo toma siempre, por defecto, un valor igual al doble de la cifra mostrada en el medidor. Una vez introduzcamos un valor o una medida en el campo “<em>Valor máximo</em>”, la visualización se adaptará adecuadamente. El valor mínimo, por defecto, es cero.
Ahora podemos llevar campos o medidas de nuestro modelo de datos a los campos adecuados de la visualización para definir el valor objetivo y los valores mínimo y máximo. Por ejemplo, escribamos en <em>Formato > Eje medidor</em> las cifras 2000000 (2 millones) para el valor mínimo, 12000000 (12 millones) para el valor máximo, y 10000000 (10 millones) para el destino:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_03.jpg"></a>
La visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_04.jpg"></a>
Comprobamos que los límites del gráfico son los valores mínimo y máximo que hemos fijado, y que se muestra con una barra roja el objetivo. Si el valor máximo fuese inferior al valor de la métrica, se mostraría todo el indicador de color naranja. Por ejemplo, en la siguiente imagen se ha llevado el valor 5000000 (5 millones) -valor inferior a los 8 millones de ventas- al campo <em>Max.</em> de la sección <em>Formato > Eje medidor</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_06.jpg"></a>
Una limitación de esta visualización es que el color naranja que indica el valor de la métrica, aunque puede personalizarse, no cambia cuando se alcanza el objetivo.
Al mover el cursor por encima de la visualización se muestra la clásica ventana emergente con la información correspondiente, aunque en ésta no se incluye información sobre el objetivo, tan solo sobre la métrica que hayamos llevado al campo <em>Valor</em> (y sobre los campos que hayamos llevado a <em>Información sobre herramientas</em>). En el ejemplo de la siguiente imagen se ha llevado la medida <em>Units</em> (conteniendo el número de unidades vendidas) a dicho campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_05.jpg"></a>
Comentar, por último, que la visualización nos permite escoger -como ya se ha adelantado- el color que representa la métrica siendo mostrada (el naranja de las anteriores imágenes) y el color de la barrita que representa el objetivo (rojo por defecto), ambas opciones personalizables en <em>Formato > Colores de datos</em>. Podemos también mostrar, ocultar y dar formato a la cifra correspondiente a la métrica que se muestra en el centro (<em>Formato > Valor de globo</em>), así como mostrar u ocultar las cifras que se muestran en los extremos de la visualización con los valores mínimo y máximo a representar (<em>Formato > Etiquetas de datos</em>).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-76fb27f2-ec1a-4f33-90c1-96dce3848c6d') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>gauge</strong>, <strong>medidor</strong> o <strong>gráfico indicador</strong> es especialmente útil si queremos mostrar un valor comparándolo con otro que se considera valor objetivo. Su panel de campos es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_01.jpg"></a>
En este tipo de visualizaciones trabajamos con un valor numérico simple y con un valor objetivo. Adicionalmente podremos limitar el valor mínimo y valor máximo a mostrar en el indicador.
<ul><li>Campo “<em>Valor</em>”: recibirá el valor numérico simple a mostrar. Solo admite uno.</li>
<li>Campo “<em>Valor mínimo</em>”: recibirá el campo que determinará el valor mínimo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Min.</em>”).</li>
<li>Campo “<em>Valor máximo</em>”: recibirá el campo que determinará el valor máximo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Máx.</em>”).</li>
<li>Campo “<em>Valor de destino</em>”: recibirá el campo que determinará el valor objetivo a mostrar en la visualización por medio de una barra (roja por defecto). Al igual que ocurre con los dos campos anteriores, si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Destino</em>”).</li>
<li>Campo “<em>Información sobre herramientas</em>”: recibirá campos cuyo contenido queremos que se muestre en la ventana emergente que se abre al mover el ratón por encima del indicador.</li>
</ul>Los campos <em>Valor mínimo</em>, <em>Valor máximo</em> y <em>Valor de destino</em> solo pueden introducirse en el panel de configuración o en el de opciones, nunca en ambos al mismo tiempo. Es necesario comentar también que la sección <em>Eje medidor</em> del panel de formato no se muestra hasta que no se lleva algún campo al panel de campos de la visualización.
Llevemos, por ejemplo, la medida <em>Sales</em> (conteniendo la suma de los importes de ventas) al campo <em>Valor</em> de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_02.jpg"></a>
Cuando creamos la visualización, el valor máximo toma siempre, por defecto, un valor igual al doble de la cifra mostrada en el medidor. Una vez introduzcamos un valor o una medida en el campo “<em>Valor máximo</em>”, la visualización se adaptará adecuadamente. El valor mínimo, por defecto, es cero.
Ahora podemos llevar campos o medidas de nuestro modelo de datos a los campos adecuados de la visualización para definir el valor objetivo y los valores mínimo y máximo. Por ejemplo, escribamos en <em>Formato > Eje medidor</em> las cifras 2000000 (2 millones) para el valor mínimo, 12000000 (12 millones) para el valor máximo, y 10000000 (10 millones) para el destino:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_03.jpg"></a>
La visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_04.jpg"></a>
Comprobamos que los límites del gráfico son los valores mínimo y máximo que hemos fijado, y que se muestra con una barra roja el objetivo. Si el valor máximo fuese inferior al valor de la métrica, se mostraría todo el indicador de color naranja. Por ejemplo, en la siguiente imagen se ha llevado el valor 5000000 (5 millones) -valor inferior a los 8 millones de ventas- al campo <em>Max.</em> de la sección <em>Formato > Eje medidor</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_06.jpg"></a>
Una limitación de esta visualización es que el color naranja que indica el valor de la métrica, aunque puede personalizarse, no cambia cuando se alcanza el objetivo.
Al mover el cursor por encima de la visualización se muestra la clásica ventana emergente con la información correspondiente, aunque en ésta no se incluye información sobre el objetivo, tan solo sobre la métrica que hayamos llevado al campo <em>Valor</em> (y sobre los campos que hayamos llevado a <em>Información sobre herramientas</em>). En el ejemplo de la siguiente imagen se ha llevado la medida <em>Units</em> (conteniendo el número de unidades vendidas) a dicho campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_05.jpg"></a>
Comentar, por último, que la visualización nos permite escoger -como ya se ha adelantado- el color que representa la métrica siendo mostrada (el naranja de las anteriores imágenes) y el color de la barrita que representa el objetivo (rojo por defecto), ambas opciones personalizables en <em>Formato > Colores de datos</em>. Podemos también mostrar, ocultar y dar formato a la cifra correspondiente a la métrica que se muestra en el centro (<em>Formato > Valor de globo</em>), así como mostrar u ocultar las cifras que se muestran en los extremos de la visualización con los valores mínimo y máximo a representar (<em>Formato > Etiquetas de datos</em>).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-76fb27f2-ec1a-4f33-90c1-96dce3848c6d') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>gauge</strong>, <strong>medidor</strong> o <strong>gráfico indicador</strong> es especialmente útil si queremos mostrar un valor comparándolo con otro que se considera valor objetivo. Su panel de campos es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_01.jpg"></a>
En este tipo de visualizaciones trabajamos con un valor numérico simple y con un valor objetivo. Adicionalmente podremos limitar el valor mínimo y valor máximo a mostrar en el indicador.
<ul><li>Campo “<em>Valor</em>”: recibirá el valor numérico simple a mostrar. Solo admite uno.</li>
<li>Campo “<em>Valor mínimo</em>”: recibirá el campo que determinará el valor mínimo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Min.</em>”).</li>
<li>Campo “<em>Valor máximo</em>”: recibirá el campo que determinará el valor máximo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Máx.</em>”).</li>
<li>Campo “<em>Valor de destino</em>”: recibirá el campo que determinará el valor objetivo a mostrar en la visualización por medio de una barra (roja por defecto). Al igual que ocurre con los dos campos anteriores, si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Destino</em>”).</li>
<li>Campo “<em>Información sobre herramientas</em>”: recibirá campos cuyo contenido queremos que se muestre en la ventana emergente que se abre al mover el ratón por encima del indicador.</li>
</ul>Los campos <em>Valor mínimo</em>, <em>Valor máximo</em> y <em>Valor de destino</em> solo pueden introducirse en el panel de configuración o en el de opciones, nunca en ambos al mismo tiempo. Es necesario comentar también que la sección <em>Eje medidor</em> del panel de formato no se muestra hasta que no se lleva algún campo al panel de campos de la visualización.
Llevemos, por ejemplo, la medida <em>Sales</em> (conteniendo la suma de los importes de ventas) al campo <em>Valor</em> de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_02.jpg"></a>
Cuando creamos la visualización, el valor máximo toma siempre, por defecto, un valor igual al doble de la cifra mostrada en el medidor. Una vez introduzcamos un valor o una medida en el campo “<em>Valor máximo</em>”, la visualización se adaptará adecuadamente. El valor mínimo, por defecto, es cero.
Ahora podemos llevar campos o medidas de nuestro modelo de datos a los campos adecuados de la visualización para definir el valor objetivo y los valores mínimo y máximo. Por ejemplo, escribamos en <em>Formato > Eje medidor</em> las cifras 2000000 (2 millones) para el valor mínimo, 12000000 (12 millones) para el valor máximo, y 10000000 (10 millones) para el destino:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_03.jpg"></a>
La visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_04.jpg"></a>
Comprobamos que los límites del gráfico son los valores mínimo y máximo que hemos fijado, y que se muestra con una barra roja el objetivo. Si el valor máximo fuese inferior al valor de la métrica, se mostraría todo el indicador de color naranja. Por ejemplo, en la siguiente imagen se ha llevado el valor 5000000 (5 millones) -valor inferior a los 8 millones de ventas- al campo <em>Max.</em> de la sección <em>Formato > Eje medidor</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_06.jpg"></a>
Una limitación de esta visualización es que el color naranja que indica el valor de la métrica, aunque puede personalizarse, no cambia cuando se alcanza el objetivo.
Al mover el cursor por encima de la visualización se muestra la clásica ventana emergente con la información correspondiente, aunque en ésta no se incluye información sobre el objetivo, tan solo sobre la métrica que hayamos llevado al campo <em>Valor</em> (y sobre los campos que hayamos llevado a <em>Información sobre herramientas</em>). En el ejemplo de la siguiente imagen se ha llevado la medida <em>Units</em> (conteniendo el número de unidades vendidas) a dicho campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_05.jpg"></a>
Comentar, por último, que la visualización nos permite escoger -como ya se ha adelantado- el color que representa la métrica siendo mostrada (el naranja de las anteriores imágenes) y el color de la barrita que representa el objetivo (rojo por defecto), ambas opciones personalizables en <em>Formato > Colores de datos</em>. Podemos también mostrar, ocultar y dar formato a la cifra correspondiente a la métrica que se muestra en el centro (<em>Formato > Valor de globo</em>), así como mostrar u ocultar las cifras que se muestran en los extremos de la visualización con los valores mínimo y máximo a representar (<em>Formato > Etiquetas de datos</em>).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(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-76fb27f2-ec1a-4f33-90c1-96dce3848c6d') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>gauge</strong>, <strong>medidor</strong> o <strong>gráfico indicador</strong> es especialmente útil si queremos mostrar un valor comparándolo con otro que se considera valor objetivo. Su panel de campos es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_01.jpg"></a>
En este tipo de visualizaciones trabajamos con un valor numérico simple y con un valor objetivo. Adicionalmente podremos limitar el valor mínimo y valor máximo a mostrar en el indicador.
<ul><li>Campo “<em>Valor</em>”: recibirá el valor numérico simple a mostrar. Solo admite uno.</li>
<li>Campo “<em>Valor mínimo</em>”: recibirá el campo que determinará el valor mínimo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Min.</em>”).</li>
<li>Campo “<em>Valor máximo</em>”: recibirá el campo que determinará el valor máximo a mostrar en la visualización. Si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Máx.</em>”).</li>
<li>Campo “<em>Valor de destino</em>”: recibirá el campo que determinará el valor objetivo a mostrar en la visualización por medio de una barra (roja por defecto). Al igual que ocurre con los dos campos anteriores, si se trata de un valor numérico simple, también puede ser introducido en el área de formato de la visualización (“<em>Formato > Eje medidor > Destino</em>”).</li>
<li>Campo “<em>Información sobre herramientas</em>”: recibirá campos cuyo contenido queremos que se muestre en la ventana emergente que se abre al mover el ratón por encima del indicador.</li>
</ul>Los campos <em>Valor mínimo</em>, <em>Valor máximo</em> y <em>Valor de destino</em> solo pueden introducirse en el panel de configuración o en el de opciones, nunca en ambos al mismo tiempo. Es necesario comentar también que la sección <em>Eje medidor</em> del panel de formato no se muestra hasta que no se lleva algún campo al panel de campos de la visualización.
Llevemos, por ejemplo, la medida <em>Sales</em> (conteniendo la suma de los importes de ventas) al campo <em>Valor</em> de la visualización:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_02.jpg"></a>
Cuando creamos la visualización, el valor máximo toma siempre, por defecto, un valor igual al doble de la cifra mostrada en el medidor. Una vez introduzcamos un valor o una medida en el campo “<em>Valor máximo</em>”, la visualización se adaptará adecuadamente. El valor mínimo, por defecto, es cero.
Ahora podemos llevar campos o medidas de nuestro modelo de datos a los campos adecuados de la visualización para definir el valor objetivo y los valores mínimo y máximo. Por ejemplo, escribamos en <em>Formato > Eje medidor</em> las cifras 2000000 (2 millones) para el valor mínimo, 12000000 (12 millones) para el valor máximo, y 10000000 (10 millones) para el destino:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_03.jpg"></a>
La visualización muestra el siguiente aspecto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_04.jpg"></a>
Comprobamos que los límites del gráfico son los valores mínimo y máximo que hemos fijado, y que se muestra con una barra roja el objetivo. Si el valor máximo fuese inferior al valor de la métrica, se mostraría todo el indicador de color naranja. Por ejemplo, en la siguiente imagen se ha llevado el valor 5000000 (5 millones) -valor inferior a los 8 millones de ventas- al campo <em>Max.</em> de la sección <em>Formato > Eje medidor</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_06.jpg"></a>
Una limitación de esta visualización es que el color naranja que indica el valor de la métrica, aunque puede personalizarse, no cambia cuando se alcanza el objetivo.
Al mover el cursor por encima de la visualización se muestra la clásica ventana emergente con la información correspondiente, aunque en ésta no se incluye información sobre el objetivo, tan solo sobre la métrica que hayamos llevado al campo <em>Valor</em> (y sobre los campos que hayamos llevado a <em>Información sobre herramientas</em>). En el ejemplo de la siguiente imagen se ha llevado la medida <em>Units</em> (conteniendo el número de unidades vendidas) a dicho campo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/gauge_05.jpg"></a>
Comentar, por último, que la visualización nos permite escoger -como ya se ha adelantado- el color que representa la métrica siendo mostrada (el naranja de las anteriores imágenes) y el color de la barrita que representa el objetivo (rojo por defecto), ambas opciones personalizables en <em>Formato > Colores de datos</em>. Podemos también mostrar, ocultar y dar formato a la cifra correspondiente a la métrica que se muestra en el centro (<em>Formato > Valor de globo</em>), así como mostrar u ocultar las cifras que se muestran en los extremos de la visualización con los valores mínimo y máximo a representar (<em>Formato > Etiquetas de datos</em>).
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\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)