- 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-cfd7d757-68ec-4277-91d3-4544c1af8d97') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-cfd7d757-68ec-4277-91d3-4544c1af8d97') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-cfd7d757-68ec-4277-91d3-4544c1af8d97') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-cfd7d757-68ec-4277-91d3-4544c1af8d97') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-241ef9b1-2649-4f32-952d-d70ca7c16958') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-241ef9b1-2649-4f32-952d-d70ca7c16958') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-241ef9b1-2649-4f32-952d-d70ca7c16958') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-241ef9b1-2649-4f32-952d-d70ca7c16958') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-bc67b78b-87b0-4a8b-b88e-6d13780d588a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-bc67b78b-87b0-4a8b-b88e-6d13780d588a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-bc67b78b-87b0-4a8b-b88e-6d13780d588a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-bc67b78b-87b0-4a8b-b88e-6d13780d588a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-b462bfde-3aa1-4009-9818-a6e1c2385629') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-b462bfde-3aa1-4009-9818-a6e1c2385629') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-b462bfde-3aa1-4009-9818-a6e1c2385629') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-b462bfde-3aa1-4009-9818-a6e1c2385629') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-4da3511f-b37e-498c-87d5-fef49d4e6f3a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-4da3511f-b37e-498c-87d5-fef49d4e6f3a') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-4da3511f-b37e-498c-87d5-fef49d4e6f3a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-4da3511f-b37e-498c-87d5-fef49d4e6f3a') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-76d67756-9f44-4cdf-8a00-fd2595c02cff') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-76d67756-9f44-4cdf-8a00-fd2595c02cff') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-76d67756-9f44-4cdf-8a00-fd2595c02cff') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-76d67756-9f44-4cdf-8a00-fd2595c02cff') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-be388e16-3076-4773-a922-8f71341cfdd8') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-be388e16-3076-4773-a922-8f71341cfdd8') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-be388e16-3076-4773-a922-8f71341cfdd8') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-be388e16-3076-4773-a922-8f71341cfdd8') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-0a1f148a-76b1-4c1e-9b96-6f1e070aa73e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-0a1f148a-76b1-4c1e-9b96-6f1e070aa73e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-0a1f148a-76b1-4c1e-9b96-6f1e070aa73e') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-0a1f148a-76b1-4c1e-9b96-6f1e070aa73e') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-fc399a0a-a894-4b8e-a21d-a98b91a78f18') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-fc399a0a-a894-4b8e-a21d-a98b91a78f18') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-fc399a0a-a894-4b8e-a21d-a98b91a78f18') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-fc399a0a-a894-4b8e-a21d-a98b91a78f18') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-44e49954-4e79-44c5-bfc8-d7a0c885b643') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-44e49954-4e79-44c5-bfc8-d7a0c885b643') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-44e49954-4e79-44c5-bfc8-d7a0c885b643') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-44e49954-4e79-44c5-bfc8-d7a0c885b643') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-b3f704e0-d1d7-48cd-8b99-9a510ec7a1d7') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-b3f704e0-d1d7-48cd-8b99-9a510ec7a1d7') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-b3f704e0-d1d7-48cd-8b99-9a510ec7a1d7') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-b3f704e0-d1d7-48cd-8b99-9a510ec7a1d7') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-b05d627c-3ce9-4b27-a05d-c5949774f847') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-b05d627c-3ce9-4b27-a05d-c5949774f847') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-b05d627c-3ce9-4b27-a05d-c5949774f847') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-b05d627c-3ce9-4b27-a05d-c5949774f847') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-dcb689d5-3ba9-44f3-8cab-360971191485') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-dcb689d5-3ba9-44f3-8cab-360971191485') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-dcb689d5-3ba9-44f3-8cab-360971191485') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-dcb689d5-3ba9-44f3-8cab-360971191485') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-aa9d8304-93d2-4702-be43-2a12e366f884') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-aa9d8304-93d2-4702-be43-2a12e366f884') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-aa9d8304-93d2-4702-be43-2a12e366f884') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-aa9d8304-93d2-4702-be43-2a12e366f884') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El objeto visual <strong>Variance Chart - XViz</strong> de <em>Visual BI Solutions</em> nos permite comparar dos conjuntos de valores (o un conjunto de valores en dos estados distintos), visualizando tanto el incremento como el porcentaje que éste representa.
El panel de campos de esta visualización incluye tres campos (más el campo <em>Tooltip Value</em> que incluye información adicional en la ventana emergente que se muestra al mover el cursor por encima de la gráfica):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_01.jpg"></a>
Obsérvese que el panel de configuración de esta visualización se muestra en inglés aun cuando la interfaz de Power BI esté en español.
<ul><li>Campo <em>Category</em>: Campo (que será interpretado como categórico) que determinará la segmentación a aplicar a las métricas. Se admite más de uno.</li>
<li>Campo <em>Primary Value</em>: Recibirá la métrica principal. Puede ser un campo o una medida. Solo se admite uno.</li>
<li>Campo <em>Comparison Value</em>: Recibirá la métrica secundaria con la que comparar la métrica principal. Igualmente puede ser un campo o una medida, pero solo se admite uno.</li>
</ul>Por ejemplo, supongamos que tenemos definidas sendas medidas para calcular las ventas en el contexto actual y las ventas para el mismo período del año anterior:
Sales CY = SUM(Sales[Amount])
Sales LY = CALCULATE([Sales CY]; SAMEPERIODLASTYEAR('Calendar'[Date]))
Si deseamos comparar los valores para un año concreto, digamos 2018 -con independencia del método por el que estemos realizando este filtrado-, bastaría con arrastrar la medida <em>Sales CY</em> al campo <em>Primary Value</em> y la medida <em>Sales LY</em> al campo <em>Comparison Value</em>. 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/variance_chart_xviz_02.jpg"></a>
Vemos que se muestran, a la izquierda, dos barras horizontales (de color negro y gris) representando los valores principal (la barra de color negro) y secundario (la barra de color gris) -solo se muestra el valor numérico correspondiente al valor principal, 1.88 M€-. A continuación se representa la variación entre las dos cifras (545.83 K€ en este ejemplo) tanto con una etiqueta como con una barra, de color verde en este ejemplo pues la variación es positiva. Si fuese negativa se mostraría de color rojo, aunque estos colores pueden personalizarse en <em>Formato > Data Colors</em>. Por último se muestra el porcentaje que esta variación representa con respecto al valor secundario (40.9% en el ejemplo).
Podemos confirmar estos valores si definimos las medidas adecuadas (calculando la variación de la cifra de ventas y el porcentaje que representa) y las llevamos a una tabla:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_03.jpg"></a>
Podemos desglosar las cifras mostradas en la visualización según un criterio adicional si llevamos un campo categórico al campo <em>Category</em> de la visualización. Por ejemplo, llevemos el campo <em>Country</em> (conteniendo los países en los que se realizan las ventas) a <em>Category</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_04.jpg"></a>
...vemos las cifras de ventas para el año actual y para el año anterior para cada uno de los países, con la variación y el porcentaje correspondiente.
Si hacemos clic en el icono con forma de rejilla que se muestra cerca de la esquina superior derecha de la visualización entramos en una especie de "modo de enfoque" en el que se muestran solo las cifras numéricas, con un práctico filtro en la parte superior que nos permite buscar la "categoría" (país en nuestro ejemplo) que nos interese:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_05.jpg"></a>
Volviendo al informe, si movemos el cursor por encima de la gráfica se abre la típica ventana emergente con la información asociada, incluyendo los campos que hayamos llevado al campo <em>Tooltip Value</em> de la visualización. Por ejemplo, en la siguiente imagen se ha llevado la medida <em>Units</em> (con la suma del 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/variance_chart_xviz_06.jpg"></a>
En todo caso, esta cifra de unidades no cambia si movemos el cursor por encima de las barras representando las métricas, si lo movemos por encima de la barra que representa la variación o por encima de las etiquetas mostrando el porcentaje de variación.
Si hacemos clic en el círculo amarillo conteniendo el icono de un lápiz que se encuentra cerca de la misma esquina superior izquierda también entramos en una especie de "modo de enfoque" que nos permite aplicar formato condicional a las barras que representan la métrica principal y secundaria:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_07.jpg"></a>
Por ejemplo, si hacemos clic en el signo "+" que se muestra a la derecha del texto "<em>Apply to Sales CY</em>" se nos muestra el panel de formato para esta métrica. Podemos optar por aplicar un formato en función de una regla o aplicar una escala de colores (selector "<em>Format by</em>"). El aspecto del panel de formato en este último caso es el siguiente:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_08.jpg"></a>
Si guardamos el formato con las opciones por defecto (haciendo clic en el botón <em>Save</em>) y volvemos al informe, 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/variance_chart_xviz_09.jpg"></a>
Apliquemos ahora un formato condicional basado en regla a las barras representando las ventas del año anterior. Para ello volvemos a hacer clic en el botón amarillo conteniendo el icono del lápiz, un clic en el signo + que se muestra a la derecha del texto "<em>Apply to Sales LY</em>" y dejamos la opción <em>Rule</em> que se muestra bajo el texto <em>Format by</em> (opción que determina el criterio de aplicación del formato condicional). A continuación deberemos configurar la condición. Para ello debemos escoger uno de los campos que hemos llevado a la visualización. Si, por ejemplo, simplemente deseásemos resaltar las columnas representando a España y Portugal, escogeríamos el campo <em>Country</em> y -en la parte superior- el color aplicar. Por último escogemos un operador y los "miembros" a añadir:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_10.jpg"></a>
Tras guardar esta configuración y volver al informe veríamos la visualización con el nuevo formato:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_11.jpg"></a>
En <em>Formato > Variance Chart Options</em> podemos escoger entre mostrar la gráfica vertical u horizontalmente, mostrar o no el valor medio de las métricas (columna "<em>Average</em>" en la siguiente imagen), el criterio de ordenación, etc.:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_12.jpg"></a>
En <em>Formato > Series Type</em> podemos especificar si queremos que las barras (o columnas, según como las estemos mostrando) se muestren solapadas, tal y como se han mostrado en las capturas de pantalla hasta ahora, o apiladas (véase la siguiente imagen). En <em>Formato > Data labels</em> podemos dar formato a las etiquetas. Por ejemplo, podemos optar por aplicar un fondo blanco en lugar del gris claro que se aplica 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/variance_chart_xviz_13.jpg"></a>
En el panel de formato encontramos multitud de opciones para dar formato a los números, ejes, leyenda... En este sentido se trata de una visualización altamente configurable y práctica.
Hay que comentar que una selección en una de las barras (o columnas) filtra la tabla correspondiente a dicha etiqueta, pero el clic hay que realizarlo en las barras o cifras, no en la etiqueta de la categoría.
Si hemos llevado más de un campo o medida al campo <em>Category</em> de la visualización vemos los típicos controles de Power BI permitiéndonos recorrer la estructura jerárquica. En la siguiente imagen se ha llevado a <em>Category</em> los campos <em>Country</em> y <em>Region</em>:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/variance_chart_xviz_14.jpg"></a>
En la imagen anterior podemos ver variaciones negativas representadas por barras rojas.
En resumen, muy interesante visualización con una utilidad muy concreta pero bien desarrollada.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\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-8d6438c4-1dca-4523-ae08-a1858b46aeab') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Gráfico de áreas</strong> o <strong>Area chart</strong> permite mostrar tendencias en el tiempo o por categorías. Está especialmente indicado cuando el orden de las categorías es importante o cuando es importante resaltar la magnitud de los cambios con el tiempo. Echemos un vistazo al panel de configuración de esta 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/area_chart_01.jpg"></a>
En este tipo de visualizaciones trabajaremos con un valor base a mostrar en la gráfica mediante áreas superpuestas (todas tienen como valor inferior el valor 0 del eje vertical), un criterio de segmentación principal (responsable de las áreas superpuestas a mostrar) y otro secundario que controlará la disposición en el eje horizontal de las áreas.
<ul><li>Campo “<em>Eje</em>”: recibirá el criterio de segmentación que controlará la disposición en el eje horizontal de las áreas superpuestas. Solo admite uno.</li>
<li>Campo “<em>Leyenda</em>”: recibirá el criterio de segmentación que dividirá el área de la gráfica en áreas menores superpuestas. Solo admite uno.</li>
<li>Campo “<em>Valor</em>”: recibirá el valor base a mostrar. Solo admite uno.</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 de los segmentos de las barras horizontales.</li>
</ul>Llevemos, por ejemplo, la medida <em>Sales</em> al campo <em>Valores</em>, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje</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/area_chart_02.jpg"></a>
Vemos que el valor a representar (ventas) se ha desglosado según el criterio que hayamos llevado al campo <em>Eje</em> (el año de venta) y que los puntos resultantes se han unido por medio de una línea y se ha coloreado el área inferior para reforzar la idea de ventas acumuladas y sus cambios de año a año.
Si llevamos otro campo -por ejemplo el campo <em>Country</em> conteniendo el país en el que se realiza la venta- al campo <em>Leyenda</em>, los valores anteriores se desglosan según el nuevo criterio:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_03.jpg"></a>
Si movemos el cursor por encima de la gráfica, se abrirá una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_04.jpg"></a>
La visualización nos permite personalizar los colores, personalizar los ejes X e Y, mostrar u ocultar la leyenda, y mostrar o no las etiquetas correspondientes a los valores representados (<em>Formato > Etiquetas de datos</em>):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_05.jpg"></a>
Si al campo <em>Eje</em> llevásemos una jerarquía (por ejemplo, de fechas), la visualización nos mostraría los típicos controles que nos permitirían recorrer la jerarquía verticalmente (en este caso, mostrando las ventas por año, trimestres, meses...).
Es de destacar que este tipo de visualización tiene un importante riesgo, y es que el lector puede quedarse con la duda de si se trata de una gráfica de áreas o de una gráfica de áreas apiladas. En un caso como el mostrado en la imagen anterior, en el que una línea (la roja) cruza otra línea (la violeta), queda claro (o debería quedar claro) que no se trata de una gráfica de áreas apiladas, pero habrá muchos casos en los que la gráfica no resuelva la duda. Por otro lado, otro inconveniente adicional proviene del hecho de que unas áreas solapan con otras, por lo que los colores no son siempre bien interpretados (y, por supuesto, esto si las áreas no son completamente opacas: si lo son, es posible incluso que unas áreas oculten las que quedan por detrás).
Es por ello que el uso de esta gráfica debe realizarse solo cuando estemos seguros de que el mensaje a transmitir va a ser claro y que la gráfica está bien personalizada de forma que no haya dudas sobre su interpretació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-8d6438c4-1dca-4523-ae08-a1858b46aeab') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Gráfico de áreas</strong> o <strong>Area chart</strong> permite mostrar tendencias en el tiempo o por categorías. Está especialmente indicado cuando el orden de las categorías es importante o cuando es importante resaltar la magnitud de los cambios con el tiempo. Echemos un vistazo al panel de configuración de esta 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/area_chart_01.jpg"></a>
En este tipo de visualizaciones trabajaremos con un valor base a mostrar en la gráfica mediante áreas superpuestas (todas tienen como valor inferior el valor 0 del eje vertical), un criterio de segmentación principal (responsable de las áreas superpuestas a mostrar) y otro secundario que controlará la disposición en el eje horizontal de las áreas.
<ul><li>Campo “<em>Eje</em>”: recibirá el criterio de segmentación que controlará la disposición en el eje horizontal de las áreas superpuestas. Solo admite uno.</li>
<li>Campo “<em>Leyenda</em>”: recibirá el criterio de segmentación que dividirá el área de la gráfica en áreas menores superpuestas. Solo admite uno.</li>
<li>Campo “<em>Valor</em>”: recibirá el valor base a mostrar. Solo admite uno.</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 de los segmentos de las barras horizontales.</li>
</ul>Llevemos, por ejemplo, la medida <em>Sales</em> al campo <em>Valores</em>, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje</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/area_chart_02.jpg"></a>
Vemos que el valor a representar (ventas) se ha desglosado según el criterio que hayamos llevado al campo <em>Eje</em> (el año de venta) y que los puntos resultantes se han unido por medio de una línea y se ha coloreado el área inferior para reforzar la idea de ventas acumuladas y sus cambios de año a año.
Si llevamos otro campo -por ejemplo el campo <em>Country</em> conteniendo el país en el que se realiza la venta- al campo <em>Leyenda</em>, los valores anteriores se desglosan según el nuevo criterio:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_03.jpg"></a>
Si movemos el cursor por encima de la gráfica, se abrirá una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_04.jpg"></a>
La visualización nos permite personalizar los colores, personalizar los ejes X e Y, mostrar u ocultar la leyenda, y mostrar o no las etiquetas correspondientes a los valores representados (<em>Formato > Etiquetas de datos</em>):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_05.jpg"></a>
Si al campo <em>Eje</em> llevásemos una jerarquía (por ejemplo, de fechas), la visualización nos mostraría los típicos controles que nos permitirían recorrer la jerarquía verticalmente (en este caso, mostrando las ventas por año, trimestres, meses...).
Es de destacar que este tipo de visualización tiene un importante riesgo, y es que el lector puede quedarse con la duda de si se trata de una gráfica de áreas o de una gráfica de áreas apiladas. En un caso como el mostrado en la imagen anterior, en el que una línea (la roja) cruza otra línea (la violeta), queda claro (o debería quedar claro) que no se trata de una gráfica de áreas apiladas, pero habrá muchos casos en los que la gráfica no resuelva la duda. Por otro lado, otro inconveniente adicional proviene del hecho de que unas áreas solapan con otras, por lo que los colores no son siempre bien interpretados (y, por supuesto, esto si las áreas no son completamente opacas: si lo son, es posible incluso que unas áreas oculten las que quedan por detrás).
Es por ello que el uso de esta gráfica debe realizarse solo cuando estemos seguros de que el mensaje a transmitir va a ser claro y que la gráfica está bien personalizada de forma que no haya dudas sobre su interpretació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-8d6438c4-1dca-4523-ae08-a1858b46aeab') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Gráfico de áreas</strong> o <strong>Area chart</strong> permite mostrar tendencias en el tiempo o por categorías. Está especialmente indicado cuando el orden de las categorías es importante o cuando es importante resaltar la magnitud de los cambios con el tiempo. Echemos un vistazo al panel de configuración de esta 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/area_chart_01.jpg"></a>
En este tipo de visualizaciones trabajaremos con un valor base a mostrar en la gráfica mediante áreas superpuestas (todas tienen como valor inferior el valor 0 del eje vertical), un criterio de segmentación principal (responsable de las áreas superpuestas a mostrar) y otro secundario que controlará la disposición en el eje horizontal de las áreas.
<ul><li>Campo “<em>Eje</em>”: recibirá el criterio de segmentación que controlará la disposición en el eje horizontal de las áreas superpuestas. Solo admite uno.</li>
<li>Campo “<em>Leyenda</em>”: recibirá el criterio de segmentación que dividirá el área de la gráfica en áreas menores superpuestas. Solo admite uno.</li>
<li>Campo “<em>Valor</em>”: recibirá el valor base a mostrar. Solo admite uno.</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 de los segmentos de las barras horizontales.</li>
</ul>Llevemos, por ejemplo, la medida <em>Sales</em> al campo <em>Valores</em>, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje</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/area_chart_02.jpg"></a>
Vemos que el valor a representar (ventas) se ha desglosado según el criterio que hayamos llevado al campo <em>Eje</em> (el año de venta) y que los puntos resultantes se han unido por medio de una línea y se ha coloreado el área inferior para reforzar la idea de ventas acumuladas y sus cambios de año a año.
Si llevamos otro campo -por ejemplo el campo <em>Country</em> conteniendo el país en el que se realiza la venta- al campo <em>Leyenda</em>, los valores anteriores se desglosan según el nuevo criterio:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_03.jpg"></a>
Si movemos el cursor por encima de la gráfica, se abrirá una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_04.jpg"></a>
La visualización nos permite personalizar los colores, personalizar los ejes X e Y, mostrar u ocultar la leyenda, y mostrar o no las etiquetas correspondientes a los valores representados (<em>Formato > Etiquetas de datos</em>):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_05.jpg"></a>
Si al campo <em>Eje</em> llevásemos una jerarquía (por ejemplo, de fechas), la visualización nos mostraría los típicos controles que nos permitirían recorrer la jerarquía verticalmente (en este caso, mostrando las ventas por año, trimestres, meses...).
Es de destacar que este tipo de visualización tiene un importante riesgo, y es que el lector puede quedarse con la duda de si se trata de una gráfica de áreas o de una gráfica de áreas apiladas. En un caso como el mostrado en la imagen anterior, en el que una línea (la roja) cruza otra línea (la violeta), queda claro (o debería quedar claro) que no se trata de una gráfica de áreas apiladas, pero habrá muchos casos en los que la gráfica no resuelva la duda. Por otro lado, otro inconveniente adicional proviene del hecho de que unas áreas solapan con otras, por lo que los colores no son siempre bien interpretados (y, por supuesto, esto si las áreas no son completamente opacas: si lo son, es posible incluso que unas áreas oculten las que quedan por detrás).
Es por ello que el uso de esta gráfica debe realizarse solo cuando estemos seguros de que el mensaje a transmitir va a ser claro y que la gráfica está bien personalizada de forma que no haya dudas sobre su interpretació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-8d6438c4-1dca-4523-ae08-a1858b46aeab') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Gráfico de áreas</strong> o <strong>Area chart</strong> permite mostrar tendencias en el tiempo o por categorías. Está especialmente indicado cuando el orden de las categorías es importante o cuando es importante resaltar la magnitud de los cambios con el tiempo. Echemos un vistazo al panel de configuración de esta 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/area_chart_01.jpg"></a>
En este tipo de visualizaciones trabajaremos con un valor base a mostrar en la gráfica mediante áreas superpuestas (todas tienen como valor inferior el valor 0 del eje vertical), un criterio de segmentación principal (responsable de las áreas superpuestas a mostrar) y otro secundario que controlará la disposición en el eje horizontal de las áreas.
<ul><li>Campo “<em>Eje</em>”: recibirá el criterio de segmentación que controlará la disposición en el eje horizontal de las áreas superpuestas. Solo admite uno.</li>
<li>Campo “<em>Leyenda</em>”: recibirá el criterio de segmentación que dividirá el área de la gráfica en áreas menores superpuestas. Solo admite uno.</li>
<li>Campo “<em>Valor</em>”: recibirá el valor base a mostrar. Solo admite uno.</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 de los segmentos de las barras horizontales.</li>
</ul>Llevemos, por ejemplo, la medida <em>Sales</em> al campo <em>Valores</em>, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje</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/area_chart_02.jpg"></a>
Vemos que el valor a representar (ventas) se ha desglosado según el criterio que hayamos llevado al campo <em>Eje</em> (el año de venta) y que los puntos resultantes se han unido por medio de una línea y se ha coloreado el área inferior para reforzar la idea de ventas acumuladas y sus cambios de año a año.
Si llevamos otro campo -por ejemplo el campo <em>Country</em> conteniendo el país en el que se realiza la venta- al campo <em>Leyenda</em>, los valores anteriores se desglosan según el nuevo criterio:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_03.jpg"></a>
Si movemos el cursor por encima de la gráfica, se abrirá una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_04.jpg"></a>
La visualización nos permite personalizar los colores, personalizar los ejes X e Y, mostrar u ocultar la leyenda, y mostrar o no las etiquetas correspondientes a los valores representados (<em>Formato > Etiquetas de datos</em>):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_05.jpg"></a>
Si al campo <em>Eje</em> llevásemos una jerarquía (por ejemplo, de fechas), la visualización nos mostraría los típicos controles que nos permitirían recorrer la jerarquía verticalmente (en este caso, mostrando las ventas por año, trimestres, meses...).
Es de destacar que este tipo de visualización tiene un importante riesgo, y es que el lector puede quedarse con la duda de si se trata de una gráfica de áreas o de una gráfica de áreas apiladas. En un caso como el mostrado en la imagen anterior, en el que una línea (la roja) cruza otra línea (la violeta), queda claro (o debería quedar claro) que no se trata de una gráfica de áreas apiladas, pero habrá muchos casos en los que la gráfica no resuelva la duda. Por otro lado, otro inconveniente adicional proviene del hecho de que unas áreas solapan con otras, por lo que los colores no son siempre bien interpretados (y, por supuesto, esto si las áreas no son completamente opacas: si lo son, es posible incluso que unas áreas oculten las que quedan por detrás).
Es por ello que el uso de esta gráfica debe realizarse solo cuando estemos seguros de que el mensaje a transmitir va a ser claro y que la gráfica está bien personalizada de forma que no haya dudas sobre su interpretació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-874489e2-15eb-4353-8589-98117517df37') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Gráfico de áreas</strong> o <strong>Area chart</strong> permite mostrar tendencias en el tiempo o por categorías. Está especialmente indicado cuando el orden de las categorías es importante o cuando es importante resaltar la magnitud de los cambios con el tiempo. Echemos un vistazo al panel de configuración de esta 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/area_chart_01.jpg"></a>
En este tipo de visualizaciones trabajaremos con un valor base a mostrar en la gráfica mediante áreas superpuestas (todas tienen como valor inferior el valor 0 del eje vertical), un criterio de segmentación principal (responsable de las áreas superpuestas a mostrar) y otro secundario que controlará la disposición en el eje horizontal de las áreas.
<ul><li>Campo “<em>Eje</em>”: recibirá el criterio de segmentación que controlará la disposición en el eje horizontal de las áreas superpuestas. Solo admite uno.</li>
<li>Campo “<em>Leyenda</em>”: recibirá el criterio de segmentación que dividirá el área de la gráfica en áreas menores superpuestas. Solo admite uno.</li>
<li>Campo “<em>Valor</em>”: recibirá el valor base a mostrar. Solo admite uno.</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 de los segmentos de las barras horizontales.</li>
</ul>Llevemos, por ejemplo, la medida <em>Sales</em> al campo <em>Valores</em>, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje</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/area_chart_02.jpg"></a>
Vemos que el valor a representar (ventas) se ha desglosado según el criterio que hayamos llevado al campo <em>Eje</em> (el año de venta) y que los puntos resultantes se han unido por medio de una línea y se ha coloreado el área inferior para reforzar la idea de ventas acumuladas y sus cambios de año a año.
Si llevamos otro campo -por ejemplo el campo <em>Country</em> conteniendo el país en el que se realiza la venta- al campo <em>Leyenda</em>, los valores anteriores se desglosan según el nuevo criterio:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_03.jpg"></a>
Si movemos el cursor por encima de la gráfica, se abrirá una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_04.jpg"></a>
La visualización nos permite personalizar los colores, personalizar los ejes X e Y, mostrar u ocultar la leyenda, y mostrar o no las etiquetas correspondientes a los valores representados (<em>Formato > Etiquetas de datos</em>):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_05.jpg"></a>
Si al campo <em>Eje</em> llevásemos una jerarquía (por ejemplo, de fechas), la visualización nos mostraría los típicos controles que nos permitirían recorrer la jerarquía verticalmente (en este caso, mostrando las ventas por año, trimestres, meses...).
Es de destacar que este tipo de visualización tiene un importante riesgo, y es que el lector puede quedarse con la duda de si se trata de una gráfica de áreas o de una gráfica de áreas apiladas. En un caso como el mostrado en la imagen anterior, en el que una línea (la roja) cruza otra línea (la violeta), queda claro (o debería quedar claro) que no se trata de una gráfica de áreas apiladas, pero habrá muchos casos en los que la gráfica no resuelva la duda. Por otro lado, otro inconveniente adicional proviene del hecho de que unas áreas solapan con otras, por lo que los colores no son siempre bien interpretados (y, por supuesto, esto si las áreas no son completamente opacas: si lo son, es posible incluso que unas áreas oculten las que quedan por detrás).
Es por ello que el uso de esta gráfica debe realizarse solo cuando estemos seguros de que el mensaje a transmitir va a ser claro y que la gráfica está bien personalizada de forma que no haya dudas sobre su interpretació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-874489e2-15eb-4353-8589-98117517df37') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Gráfico de áreas</strong> o <strong>Area chart</strong> permite mostrar tendencias en el tiempo o por categorías. Está especialmente indicado cuando el orden de las categorías es importante o cuando es importante resaltar la magnitud de los cambios con el tiempo. Echemos un vistazo al panel de configuración de esta 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/area_chart_01.jpg"></a>
En este tipo de visualizaciones trabajaremos con un valor base a mostrar en la gráfica mediante áreas superpuestas (todas tienen como valor inferior el valor 0 del eje vertical), un criterio de segmentación principal (responsable de las áreas superpuestas a mostrar) y otro secundario que controlará la disposición en el eje horizontal de las áreas.
<ul><li>Campo “<em>Eje</em>”: recibirá el criterio de segmentación que controlará la disposición en el eje horizontal de las áreas superpuestas. Solo admite uno.</li>
<li>Campo “<em>Leyenda</em>”: recibirá el criterio de segmentación que dividirá el área de la gráfica en áreas menores superpuestas. Solo admite uno.</li>
<li>Campo “<em>Valor</em>”: recibirá el valor base a mostrar. Solo admite uno.</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 de los segmentos de las barras horizontales.</li>
</ul>Llevemos, por ejemplo, la medida <em>Sales</em> al campo <em>Valores</em>, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje</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/area_chart_02.jpg"></a>
Vemos que el valor a representar (ventas) se ha desglosado según el criterio que hayamos llevado al campo <em>Eje</em> (el año de venta) y que los puntos resultantes se han unido por medio de una línea y se ha coloreado el área inferior para reforzar la idea de ventas acumuladas y sus cambios de año a año.
Si llevamos otro campo -por ejemplo el campo <em>Country</em> conteniendo el país en el que se realiza la venta- al campo <em>Leyenda</em>, los valores anteriores se desglosan según el nuevo criterio:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_03.jpg"></a>
Si movemos el cursor por encima de la gráfica, se abrirá una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_04.jpg"></a>
La visualización nos permite personalizar los colores, personalizar los ejes X e Y, mostrar u ocultar la leyenda, y mostrar o no las etiquetas correspondientes a los valores representados (<em>Formato > Etiquetas de datos</em>):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_05.jpg"></a>
Si al campo <em>Eje</em> llevásemos una jerarquía (por ejemplo, de fechas), la visualización nos mostraría los típicos controles que nos permitirían recorrer la jerarquía verticalmente (en este caso, mostrando las ventas por año, trimestres, meses...).
Es de destacar que este tipo de visualización tiene un importante riesgo, y es que el lector puede quedarse con la duda de si se trata de una gráfica de áreas o de una gráfica de áreas apiladas. En un caso como el mostrado en la imagen anterior, en el que una línea (la roja) cruza otra línea (la violeta), queda claro (o debería quedar claro) que no se trata de una gráfica de áreas apiladas, pero habrá muchos casos en los que la gráfica no resuelva la duda. Por otro lado, otro inconveniente adicional proviene del hecho de que unas áreas solapan con otras, por lo que los colores no son siempre bien interpretados (y, por supuesto, esto si las áreas no son completamente opacas: si lo son, es posible incluso que unas áreas oculten las que quedan por detrás).
Es por ello que el uso de esta gráfica debe realizarse solo cuando estemos seguros de que el mensaje a transmitir va a ser claro y que la gráfica está bien personalizada de forma que no haya dudas sobre su interpretació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-874489e2-15eb-4353-8589-98117517df37') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Gráfico de áreas</strong> o <strong>Area chart</strong> permite mostrar tendencias en el tiempo o por categorías. Está especialmente indicado cuando el orden de las categorías es importante o cuando es importante resaltar la magnitud de los cambios con el tiempo. Echemos un vistazo al panel de configuración de esta 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/area_chart_01.jpg"></a>
En este tipo de visualizaciones trabajaremos con un valor base a mostrar en la gráfica mediante áreas superpuestas (todas tienen como valor inferior el valor 0 del eje vertical), un criterio de segmentación principal (responsable de las áreas superpuestas a mostrar) y otro secundario que controlará la disposición en el eje horizontal de las áreas.
<ul><li>Campo “<em>Eje</em>”: recibirá el criterio de segmentación que controlará la disposición en el eje horizontal de las áreas superpuestas. Solo admite uno.</li>
<li>Campo “<em>Leyenda</em>”: recibirá el criterio de segmentación que dividirá el área de la gráfica en áreas menores superpuestas. Solo admite uno.</li>
<li>Campo “<em>Valor</em>”: recibirá el valor base a mostrar. Solo admite uno.</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 de los segmentos de las barras horizontales.</li>
</ul>Llevemos, por ejemplo, la medida <em>Sales</em> al campo <em>Valores</em>, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje</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/area_chart_02.jpg"></a>
Vemos que el valor a representar (ventas) se ha desglosado según el criterio que hayamos llevado al campo <em>Eje</em> (el año de venta) y que los puntos resultantes se han unido por medio de una línea y se ha coloreado el área inferior para reforzar la idea de ventas acumuladas y sus cambios de año a año.
Si llevamos otro campo -por ejemplo el campo <em>Country</em> conteniendo el país en el que se realiza la venta- al campo <em>Leyenda</em>, los valores anteriores se desglosan según el nuevo criterio:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_03.jpg"></a>
Si movemos el cursor por encima de la gráfica, se abrirá una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_04.jpg"></a>
La visualización nos permite personalizar los colores, personalizar los ejes X e Y, mostrar u ocultar la leyenda, y mostrar o no las etiquetas correspondientes a los valores representados (<em>Formato > Etiquetas de datos</em>):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_05.jpg"></a>
Si al campo <em>Eje</em> llevásemos una jerarquía (por ejemplo, de fechas), la visualización nos mostraría los típicos controles que nos permitirían recorrer la jerarquía verticalmente (en este caso, mostrando las ventas por año, trimestres, meses...).
Es de destacar que este tipo de visualización tiene un importante riesgo, y es que el lector puede quedarse con la duda de si se trata de una gráfica de áreas o de una gráfica de áreas apiladas. En un caso como el mostrado en la imagen anterior, en el que una línea (la roja) cruza otra línea (la violeta), queda claro (o debería quedar claro) que no se trata de una gráfica de áreas apiladas, pero habrá muchos casos en los que la gráfica no resuelva la duda. Por otro lado, otro inconveniente adicional proviene del hecho de que unas áreas solapan con otras, por lo que los colores no son siempre bien interpretados (y, por supuesto, esto si las áreas no son completamente opacas: si lo son, es posible incluso que unas áreas oculten las que quedan por detrás).
Es por ello que el uso de esta gráfica debe realizarse solo cuando estemos seguros de que el mensaje a transmitir va a ser claro y que la gráfica está bien personalizada de forma que no haya dudas sobre su interpretació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-874489e2-15eb-4353-8589-98117517df37') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Gráfico de áreas</strong> o <strong>Area chart</strong> permite mostrar tendencias en el tiempo o por categorías. Está especialmente indicado cuando el orden de las categorías es importante o cuando es importante resaltar la magnitud de los cambios con el tiempo. Echemos un vistazo al panel de configuración de esta 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/area_chart_01.jpg"></a>
En este tipo de visualizaciones trabajaremos con un valor base a mostrar en la gráfica mediante áreas superpuestas (todas tienen como valor inferior el valor 0 del eje vertical), un criterio de segmentación principal (responsable de las áreas superpuestas a mostrar) y otro secundario que controlará la disposición en el eje horizontal de las áreas.
<ul><li>Campo “<em>Eje</em>”: recibirá el criterio de segmentación que controlará la disposición en el eje horizontal de las áreas superpuestas. Solo admite uno.</li>
<li>Campo “<em>Leyenda</em>”: recibirá el criterio de segmentación que dividirá el área de la gráfica en áreas menores superpuestas. Solo admite uno.</li>
<li>Campo “<em>Valor</em>”: recibirá el valor base a mostrar. Solo admite uno.</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 de los segmentos de las barras horizontales.</li>
</ul>Llevemos, por ejemplo, la medida <em>Sales</em> al campo <em>Valores</em>, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje</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/area_chart_02.jpg"></a>
Vemos que el valor a representar (ventas) se ha desglosado según el criterio que hayamos llevado al campo <em>Eje</em> (el año de venta) y que los puntos resultantes se han unido por medio de una línea y se ha coloreado el área inferior para reforzar la idea de ventas acumuladas y sus cambios de año a año.
Si llevamos otro campo -por ejemplo el campo <em>Country</em> conteniendo el país en el que se realiza la venta- al campo <em>Leyenda</em>, los valores anteriores se desglosan según el nuevo criterio:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_03.jpg"></a>
Si movemos el cursor por encima de la gráfica, se abrirá una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_04.jpg"></a>
La visualización nos permite personalizar los colores, personalizar los ejes X e Y, mostrar u ocultar la leyenda, y mostrar o no las etiquetas correspondientes a los valores representados (<em>Formato > Etiquetas de datos</em>):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_05.jpg"></a>
Si al campo <em>Eje</em> llevásemos una jerarquía (por ejemplo, de fechas), la visualización nos mostraría los típicos controles que nos permitirían recorrer la jerarquía verticalmente (en este caso, mostrando las ventas por año, trimestres, meses...).
Es de destacar que este tipo de visualización tiene un importante riesgo, y es que el lector puede quedarse con la duda de si se trata de una gráfica de áreas o de una gráfica de áreas apiladas. En un caso como el mostrado en la imagen anterior, en el que una línea (la roja) cruza otra línea (la violeta), queda claro (o debería quedar claro) que no se trata de una gráfica de áreas apiladas, pero habrá muchos casos en los que la gráfica no resuelva la duda. Por otro lado, otro inconveniente adicional proviene del hecho de que unas áreas solapan con otras, por lo que los colores no son siempre bien interpretados (y, por supuesto, esto si las áreas no son completamente opacas: si lo son, es posible incluso que unas áreas oculten las que quedan por detrás).
Es por ello que el uso de esta gráfica debe realizarse solo cuando estemos seguros de que el mensaje a transmitir va a ser claro y que la gráfica está bien personalizada de forma que no haya dudas sobre su interpretació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-248ffc91-a89f-4727-928a-682b0b72d45c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Gráfico de áreas</strong> o <strong>Area chart</strong> permite mostrar tendencias en el tiempo o por categorías. Está especialmente indicado cuando el orden de las categorías es importante o cuando es importante resaltar la magnitud de los cambios con el tiempo. Echemos un vistazo al panel de configuración de esta 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/area_chart_01.jpg"></a>
En este tipo de visualizaciones trabajaremos con un valor base a mostrar en la gráfica mediante áreas superpuestas (todas tienen como valor inferior el valor 0 del eje vertical), un criterio de segmentación principal (responsable de las áreas superpuestas a mostrar) y otro secundario que controlará la disposición en el eje horizontal de las áreas.
<ul><li>Campo “<em>Eje</em>”: recibirá el criterio de segmentación que controlará la disposición en el eje horizontal de las áreas superpuestas. Solo admite uno.</li>
<li>Campo “<em>Leyenda</em>”: recibirá el criterio de segmentación que dividirá el área de la gráfica en áreas menores superpuestas. Solo admite uno.</li>
<li>Campo “<em>Valor</em>”: recibirá el valor base a mostrar. Solo admite uno.</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 de los segmentos de las barras horizontales.</li>
</ul>Llevemos, por ejemplo, la medida <em>Sales</em> al campo <em>Valores</em>, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje</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/area_chart_02.jpg"></a>
Vemos que el valor a representar (ventas) se ha desglosado según el criterio que hayamos llevado al campo <em>Eje</em> (el año de venta) y que los puntos resultantes se han unido por medio de una línea y se ha coloreado el área inferior para reforzar la idea de ventas acumuladas y sus cambios de año a año.
Si llevamos otro campo -por ejemplo el campo <em>Country</em> conteniendo el país en el que se realiza la venta- al campo <em>Leyenda</em>, los valores anteriores se desglosan según el nuevo criterio:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_03.jpg"></a>
Si movemos el cursor por encima de la gráfica, se abrirá una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_04.jpg"></a>
La visualización nos permite personalizar los colores, personalizar los ejes X e Y, mostrar u ocultar la leyenda, y mostrar o no las etiquetas correspondientes a los valores representados (<em>Formato > Etiquetas de datos</em>):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_05.jpg"></a>
Si al campo <em>Eje</em> llevásemos una jerarquía (por ejemplo, de fechas), la visualización nos mostraría los típicos controles que nos permitirían recorrer la jerarquía verticalmente (en este caso, mostrando las ventas por año, trimestres, meses...).
Es de destacar que este tipo de visualización tiene un importante riesgo, y es que el lector puede quedarse con la duda de si se trata de una gráfica de áreas o de una gráfica de áreas apiladas. En un caso como el mostrado en la imagen anterior, en el que una línea (la roja) cruza otra línea (la violeta), queda claro (o debería quedar claro) que no se trata de una gráfica de áreas apiladas, pero habrá muchos casos en los que la gráfica no resuelva la duda. Por otro lado, otro inconveniente adicional proviene del hecho de que unas áreas solapan con otras, por lo que los colores no son siempre bien interpretados (y, por supuesto, esto si las áreas no son completamente opacas: si lo son, es posible incluso que unas áreas oculten las que quedan por detrás).
Es por ello que el uso de esta gráfica debe realizarse solo cuando estemos seguros de que el mensaje a transmitir va a ser claro y que la gráfica está bien personalizada de forma que no haya dudas sobre su interpretació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-248ffc91-a89f-4727-928a-682b0b72d45c') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Gráfico de áreas</strong> o <strong>Area chart</strong> permite mostrar tendencias en el tiempo o por categorías. Está especialmente indicado cuando el orden de las categorías es importante o cuando es importante resaltar la magnitud de los cambios con el tiempo. Echemos un vistazo al panel de configuración de esta 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/area_chart_01.jpg"></a>
En este tipo de visualizaciones trabajaremos con un valor base a mostrar en la gráfica mediante áreas superpuestas (todas tienen como valor inferior el valor 0 del eje vertical), un criterio de segmentación principal (responsable de las áreas superpuestas a mostrar) y otro secundario que controlará la disposición en el eje horizontal de las áreas.
<ul><li>Campo “<em>Eje</em>”: recibirá el criterio de segmentación que controlará la disposición en el eje horizontal de las áreas superpuestas. Solo admite uno.</li>
<li>Campo “<em>Leyenda</em>”: recibirá el criterio de segmentación que dividirá el área de la gráfica en áreas menores superpuestas. Solo admite uno.</li>
<li>Campo “<em>Valor</em>”: recibirá el valor base a mostrar. Solo admite uno.</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 de los segmentos de las barras horizontales.</li>
</ul>Llevemos, por ejemplo, la medida <em>Sales</em> al campo <em>Valores</em>, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje</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/area_chart_02.jpg"></a>
Vemos que el valor a representar (ventas) se ha desglosado según el criterio que hayamos llevado al campo <em>Eje</em> (el año de venta) y que los puntos resultantes se han unido por medio de una línea y se ha coloreado el área inferior para reforzar la idea de ventas acumuladas y sus cambios de año a año.
Si llevamos otro campo -por ejemplo el campo <em>Country</em> conteniendo el país en el que se realiza la venta- al campo <em>Leyenda</em>, los valores anteriores se desglosan según el nuevo criterio:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_03.jpg"></a>
Si movemos el cursor por encima de la gráfica, se abrirá una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_04.jpg"></a>
La visualización nos permite personalizar los colores, personalizar los ejes X e Y, mostrar u ocultar la leyenda, y mostrar o no las etiquetas correspondientes a los valores representados (<em>Formato > Etiquetas de datos</em>):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_05.jpg"></a>
Si al campo <em>Eje</em> llevásemos una jerarquía (por ejemplo, de fechas), la visualización nos mostraría los típicos controles que nos permitirían recorrer la jerarquía verticalmente (en este caso, mostrando las ventas por año, trimestres, meses...).
Es de destacar que este tipo de visualización tiene un importante riesgo, y es que el lector puede quedarse con la duda de si se trata de una gráfica de áreas o de una gráfica de áreas apiladas. En un caso como el mostrado en la imagen anterior, en el que una línea (la roja) cruza otra línea (la violeta), queda claro (o debería quedar claro) que no se trata de una gráfica de áreas apiladas, pero habrá muchos casos en los que la gráfica no resuelva la duda. Por otro lado, otro inconveniente adicional proviene del hecho de que unas áreas solapan con otras, por lo que los colores no son siempre bien interpretados (y, por supuesto, esto si las áreas no son completamente opacas: si lo son, es posible incluso que unas áreas oculten las que quedan por detrás).
Es por ello que el uso de esta gráfica debe realizarse solo cuando estemos seguros de que el mensaje a transmitir va a ser claro y que la gráfica está bien personalizada de forma que no haya dudas sobre su interpretació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-248ffc91-a89f-4727-928a-682b0b72d45c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Gráfico de áreas</strong> o <strong>Area chart</strong> permite mostrar tendencias en el tiempo o por categorías. Está especialmente indicado cuando el orden de las categorías es importante o cuando es importante resaltar la magnitud de los cambios con el tiempo. Echemos un vistazo al panel de configuración de esta 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/area_chart_01.jpg"></a>
En este tipo de visualizaciones trabajaremos con un valor base a mostrar en la gráfica mediante áreas superpuestas (todas tienen como valor inferior el valor 0 del eje vertical), un criterio de segmentación principal (responsable de las áreas superpuestas a mostrar) y otro secundario que controlará la disposición en el eje horizontal de las áreas.
<ul><li>Campo “<em>Eje</em>”: recibirá el criterio de segmentación que controlará la disposición en el eje horizontal de las áreas superpuestas. Solo admite uno.</li>
<li>Campo “<em>Leyenda</em>”: recibirá el criterio de segmentación que dividirá el área de la gráfica en áreas menores superpuestas. Solo admite uno.</li>
<li>Campo “<em>Valor</em>”: recibirá el valor base a mostrar. Solo admite uno.</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 de los segmentos de las barras horizontales.</li>
</ul>Llevemos, por ejemplo, la medida <em>Sales</em> al campo <em>Valores</em>, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje</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/area_chart_02.jpg"></a>
Vemos que el valor a representar (ventas) se ha desglosado según el criterio que hayamos llevado al campo <em>Eje</em> (el año de venta) y que los puntos resultantes se han unido por medio de una línea y se ha coloreado el área inferior para reforzar la idea de ventas acumuladas y sus cambios de año a año.
Si llevamos otro campo -por ejemplo el campo <em>Country</em> conteniendo el país en el que se realiza la venta- al campo <em>Leyenda</em>, los valores anteriores se desglosan según el nuevo criterio:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_03.jpg"></a>
Si movemos el cursor por encima de la gráfica, se abrirá una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_04.jpg"></a>
La visualización nos permite personalizar los colores, personalizar los ejes X e Y, mostrar u ocultar la leyenda, y mostrar o no las etiquetas correspondientes a los valores representados (<em>Formato > Etiquetas de datos</em>):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_05.jpg"></a>
Si al campo <em>Eje</em> llevásemos una jerarquía (por ejemplo, de fechas), la visualización nos mostraría los típicos controles que nos permitirían recorrer la jerarquía verticalmente (en este caso, mostrando las ventas por año, trimestres, meses...).
Es de destacar que este tipo de visualización tiene un importante riesgo, y es que el lector puede quedarse con la duda de si se trata de una gráfica de áreas o de una gráfica de áreas apiladas. En un caso como el mostrado en la imagen anterior, en el que una línea (la roja) cruza otra línea (la violeta), queda claro (o debería quedar claro) que no se trata de una gráfica de áreas apiladas, pero habrá muchos casos en los que la gráfica no resuelva la duda. Por otro lado, otro inconveniente adicional proviene del hecho de que unas áreas solapan con otras, por lo que los colores no son siempre bien interpretados (y, por supuesto, esto si las áreas no son completamente opacas: si lo son, es posible incluso que unas áreas oculten las que quedan por detrás).
Es por ello que el uso de esta gráfica debe realizarse solo cuando estemos seguros de que el mensaje a transmitir va a ser claro y que la gráfica está bien personalizada de forma que no haya dudas sobre su interpretació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-248ffc91-a89f-4727-928a-682b0b72d45c') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Gráfico de áreas</strong> o <strong>Area chart</strong> permite mostrar tendencias en el tiempo o por categorías. Está especialmente indicado cuando el orden de las categorías es importante o cuando es importante resaltar la magnitud de los cambios con el tiempo. Echemos un vistazo al panel de configuración de esta 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/area_chart_01.jpg"></a>
En este tipo de visualizaciones trabajaremos con un valor base a mostrar en la gráfica mediante áreas superpuestas (todas tienen como valor inferior el valor 0 del eje vertical), un criterio de segmentación principal (responsable de las áreas superpuestas a mostrar) y otro secundario que controlará la disposición en el eje horizontal de las áreas.
<ul><li>Campo “<em>Eje</em>”: recibirá el criterio de segmentación que controlará la disposición en el eje horizontal de las áreas superpuestas. Solo admite uno.</li>
<li>Campo “<em>Leyenda</em>”: recibirá el criterio de segmentación que dividirá el área de la gráfica en áreas menores superpuestas. Solo admite uno.</li>
<li>Campo “<em>Valor</em>”: recibirá el valor base a mostrar. Solo admite uno.</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 de los segmentos de las barras horizontales.</li>
</ul>Llevemos, por ejemplo, la medida <em>Sales</em> al campo <em>Valores</em>, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje</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/area_chart_02.jpg"></a>
Vemos que el valor a representar (ventas) se ha desglosado según el criterio que hayamos llevado al campo <em>Eje</em> (el año de venta) y que los puntos resultantes se han unido por medio de una línea y se ha coloreado el área inferior para reforzar la idea de ventas acumuladas y sus cambios de año a año.
Si llevamos otro campo -por ejemplo el campo <em>Country</em> conteniendo el país en el que se realiza la venta- al campo <em>Leyenda</em>, los valores anteriores se desglosan según el nuevo criterio:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_03.jpg"></a>
Si movemos el cursor por encima de la gráfica, se abrirá una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_04.jpg"></a>
La visualización nos permite personalizar los colores, personalizar los ejes X e Y, mostrar u ocultar la leyenda, y mostrar o no las etiquetas correspondientes a los valores representados (<em>Formato > Etiquetas de datos</em>):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_05.jpg"></a>
Si al campo <em>Eje</em> llevásemos una jerarquía (por ejemplo, de fechas), la visualización nos mostraría los típicos controles que nos permitirían recorrer la jerarquía verticalmente (en este caso, mostrando las ventas por año, trimestres, meses...).
Es de destacar que este tipo de visualización tiene un importante riesgo, y es que el lector puede quedarse con la duda de si se trata de una gráfica de áreas o de una gráfica de áreas apiladas. En un caso como el mostrado en la imagen anterior, en el que una línea (la roja) cruza otra línea (la violeta), queda claro (o debería quedar claro) que no se trata de una gráfica de áreas apiladas, pero habrá muchos casos en los que la gráfica no resuelva la duda. Por otro lado, otro inconveniente adicional proviene del hecho de que unas áreas solapan con otras, por lo que los colores no son siempre bien interpretados (y, por supuesto, esto si las áreas no son completamente opacas: si lo son, es posible incluso que unas áreas oculten las que quedan por detrás).
Es por ello que el uso de esta gráfica debe realizarse solo cuando estemos seguros de que el mensaje a transmitir va a ser claro y que la gráfica está bien personalizada de forma que no haya dudas sobre su interpretació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-71a87557-2fc4-4c65-bb37-e0762852eebc') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Gráfico de áreas</strong> o <strong>Area chart</strong> permite mostrar tendencias en el tiempo o por categorías. Está especialmente indicado cuando el orden de las categorías es importante o cuando es importante resaltar la magnitud de los cambios con el tiempo. Echemos un vistazo al panel de configuración de esta 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/area_chart_01.jpg"></a>
En este tipo de visualizaciones trabajaremos con un valor base a mostrar en la gráfica mediante áreas superpuestas (todas tienen como valor inferior el valor 0 del eje vertical), un criterio de segmentación principal (responsable de las áreas superpuestas a mostrar) y otro secundario que controlará la disposición en el eje horizontal de las áreas.
<ul><li>Campo “<em>Eje</em>”: recibirá el criterio de segmentación que controlará la disposición en el eje horizontal de las áreas superpuestas. Solo admite uno.</li>
<li>Campo “<em>Leyenda</em>”: recibirá el criterio de segmentación que dividirá el área de la gráfica en áreas menores superpuestas. Solo admite uno.</li>
<li>Campo “<em>Valor</em>”: recibirá el valor base a mostrar. Solo admite uno.</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 de los segmentos de las barras horizontales.</li>
</ul>Llevemos, por ejemplo, la medida <em>Sales</em> al campo <em>Valores</em>, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje</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/area_chart_02.jpg"></a>
Vemos que el valor a representar (ventas) se ha desglosado según el criterio que hayamos llevado al campo <em>Eje</em> (el año de venta) y que los puntos resultantes se han unido por medio de una línea y se ha coloreado el área inferior para reforzar la idea de ventas acumuladas y sus cambios de año a año.
Si llevamos otro campo -por ejemplo el campo <em>Country</em> conteniendo el país en el que se realiza la venta- al campo <em>Leyenda</em>, los valores anteriores se desglosan según el nuevo criterio:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_03.jpg"></a>
Si movemos el cursor por encima de la gráfica, se abrirá una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_04.jpg"></a>
La visualización nos permite personalizar los colores, personalizar los ejes X e Y, mostrar u ocultar la leyenda, y mostrar o no las etiquetas correspondientes a los valores representados (<em>Formato > Etiquetas de datos</em>):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_05.jpg"></a>
Si al campo <em>Eje</em> llevásemos una jerarquía (por ejemplo, de fechas), la visualización nos mostraría los típicos controles que nos permitirían recorrer la jerarquía verticalmente (en este caso, mostrando las ventas por año, trimestres, meses...).
Es de destacar que este tipo de visualización tiene un importante riesgo, y es que el lector puede quedarse con la duda de si se trata de una gráfica de áreas o de una gráfica de áreas apiladas. En un caso como el mostrado en la imagen anterior, en el que una línea (la roja) cruza otra línea (la violeta), queda claro (o debería quedar claro) que no se trata de una gráfica de áreas apiladas, pero habrá muchos casos en los que la gráfica no resuelva la duda. Por otro lado, otro inconveniente adicional proviene del hecho de que unas áreas solapan con otras, por lo que los colores no son siempre bien interpretados (y, por supuesto, esto si las áreas no son completamente opacas: si lo son, es posible incluso que unas áreas oculten las que quedan por detrás).
Es por ello que el uso de esta gráfica debe realizarse solo cuando estemos seguros de que el mensaje a transmitir va a ser claro y que la gráfica está bien personalizada de forma que no haya dudas sobre su interpretació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-71a87557-2fc4-4c65-bb37-e0762852eebc') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Gráfico de áreas</strong> o <strong>Area chart</strong> permite mostrar tendencias en el tiempo o por categorías. Está especialmente indicado cuando el orden de las categorías es importante o cuando es importante resaltar la magnitud de los cambios con el tiempo. Echemos un vistazo al panel de configuración de esta 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/area_chart_01.jpg"></a>
En este tipo de visualizaciones trabajaremos con un valor base a mostrar en la gráfica mediante áreas superpuestas (todas tienen como valor inferior el valor 0 del eje vertical), un criterio de segmentación principal (responsable de las áreas superpuestas a mostrar) y otro secundario que controlará la disposición en el eje horizontal de las áreas.
<ul><li>Campo “<em>Eje</em>”: recibirá el criterio de segmentación que controlará la disposición en el eje horizontal de las áreas superpuestas. Solo admite uno.</li>
<li>Campo “<em>Leyenda</em>”: recibirá el criterio de segmentación que dividirá el área de la gráfica en áreas menores superpuestas. Solo admite uno.</li>
<li>Campo “<em>Valor</em>”: recibirá el valor base a mostrar. Solo admite uno.</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 de los segmentos de las barras horizontales.</li>
</ul>Llevemos, por ejemplo, la medida <em>Sales</em> al campo <em>Valores</em>, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje</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/area_chart_02.jpg"></a>
Vemos que el valor a representar (ventas) se ha desglosado según el criterio que hayamos llevado al campo <em>Eje</em> (el año de venta) y que los puntos resultantes se han unido por medio de una línea y se ha coloreado el área inferior para reforzar la idea de ventas acumuladas y sus cambios de año a año.
Si llevamos otro campo -por ejemplo el campo <em>Country</em> conteniendo el país en el que se realiza la venta- al campo <em>Leyenda</em>, los valores anteriores se desglosan según el nuevo criterio:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_03.jpg"></a>
Si movemos el cursor por encima de la gráfica, se abrirá una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_04.jpg"></a>
La visualización nos permite personalizar los colores, personalizar los ejes X e Y, mostrar u ocultar la leyenda, y mostrar o no las etiquetas correspondientes a los valores representados (<em>Formato > Etiquetas de datos</em>):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_05.jpg"></a>
Si al campo <em>Eje</em> llevásemos una jerarquía (por ejemplo, de fechas), la visualización nos mostraría los típicos controles que nos permitirían recorrer la jerarquía verticalmente (en este caso, mostrando las ventas por año, trimestres, meses...).
Es de destacar que este tipo de visualización tiene un importante riesgo, y es que el lector puede quedarse con la duda de si se trata de una gráfica de áreas o de una gráfica de áreas apiladas. En un caso como el mostrado en la imagen anterior, en el que una línea (la roja) cruza otra línea (la violeta), queda claro (o debería quedar claro) que no se trata de una gráfica de áreas apiladas, pero habrá muchos casos en los que la gráfica no resuelva la duda. Por otro lado, otro inconveniente adicional proviene del hecho de que unas áreas solapan con otras, por lo que los colores no son siempre bien interpretados (y, por supuesto, esto si las áreas no son completamente opacas: si lo son, es posible incluso que unas áreas oculten las que quedan por detrás).
Es por ello que el uso de esta gráfica debe realizarse solo cuando estemos seguros de que el mensaje a transmitir va a ser claro y que la gráfica está bien personalizada de forma que no haya dudas sobre su interpretació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-71a87557-2fc4-4c65-bb37-e0762852eebc') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Gráfico de áreas</strong> o <strong>Area chart</strong> permite mostrar tendencias en el tiempo o por categorías. Está especialmente indicado cuando el orden de las categorías es importante o cuando es importante resaltar la magnitud de los cambios con el tiempo. Echemos un vistazo al panel de configuración de esta 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/area_chart_01.jpg"></a>
En este tipo de visualizaciones trabajaremos con un valor base a mostrar en la gráfica mediante áreas superpuestas (todas tienen como valor inferior el valor 0 del eje vertical), un criterio de segmentación principal (responsable de las áreas superpuestas a mostrar) y otro secundario que controlará la disposición en el eje horizontal de las áreas.
<ul><li>Campo “<em>Eje</em>”: recibirá el criterio de segmentación que controlará la disposición en el eje horizontal de las áreas superpuestas. Solo admite uno.</li>
<li>Campo “<em>Leyenda</em>”: recibirá el criterio de segmentación que dividirá el área de la gráfica en áreas menores superpuestas. Solo admite uno.</li>
<li>Campo “<em>Valor</em>”: recibirá el valor base a mostrar. Solo admite uno.</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 de los segmentos de las barras horizontales.</li>
</ul>Llevemos, por ejemplo, la medida <em>Sales</em> al campo <em>Valores</em>, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje</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/area_chart_02.jpg"></a>
Vemos que el valor a representar (ventas) se ha desglosado según el criterio que hayamos llevado al campo <em>Eje</em> (el año de venta) y que los puntos resultantes se han unido por medio de una línea y se ha coloreado el área inferior para reforzar la idea de ventas acumuladas y sus cambios de año a año.
Si llevamos otro campo -por ejemplo el campo <em>Country</em> conteniendo el país en el que se realiza la venta- al campo <em>Leyenda</em>, los valores anteriores se desglosan según el nuevo criterio:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_03.jpg"></a>
Si movemos el cursor por encima de la gráfica, se abrirá una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_04.jpg"></a>
La visualización nos permite personalizar los colores, personalizar los ejes X e Y, mostrar u ocultar la leyenda, y mostrar o no las etiquetas correspondientes a los valores representados (<em>Formato > Etiquetas de datos</em>):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_05.jpg"></a>
Si al campo <em>Eje</em> llevásemos una jerarquía (por ejemplo, de fechas), la visualización nos mostraría los típicos controles que nos permitirían recorrer la jerarquía verticalmente (en este caso, mostrando las ventas por año, trimestres, meses...).
Es de destacar que este tipo de visualización tiene un importante riesgo, y es que el lector puede quedarse con la duda de si se trata de una gráfica de áreas o de una gráfica de áreas apiladas. En un caso como el mostrado en la imagen anterior, en el que una línea (la roja) cruza otra línea (la violeta), queda claro (o debería quedar claro) que no se trata de una gráfica de áreas apiladas, pero habrá muchos casos en los que la gráfica no resuelva la duda. Por otro lado, otro inconveniente adicional proviene del hecho de que unas áreas solapan con otras, por lo que los colores no son siempre bien interpretados (y, por supuesto, esto si las áreas no son completamente opacas: si lo son, es posible incluso que unas áreas oculten las que quedan por detrás).
Es por ello que el uso de esta gráfica debe realizarse solo cuando estemos seguros de que el mensaje a transmitir va a ser claro y que la gráfica está bien personalizada de forma que no haya dudas sobre su interpretació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-71a87557-2fc4-4c65-bb37-e0762852eebc') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Gráfico de áreas</strong> o <strong>Area chart</strong> permite mostrar tendencias en el tiempo o por categorías. Está especialmente indicado cuando el orden de las categorías es importante o cuando es importante resaltar la magnitud de los cambios con el tiempo. Echemos un vistazo al panel de configuración de esta 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/area_chart_01.jpg"></a>
En este tipo de visualizaciones trabajaremos con un valor base a mostrar en la gráfica mediante áreas superpuestas (todas tienen como valor inferior el valor 0 del eje vertical), un criterio de segmentación principal (responsable de las áreas superpuestas a mostrar) y otro secundario que controlará la disposición en el eje horizontal de las áreas.
<ul><li>Campo “<em>Eje</em>”: recibirá el criterio de segmentación que controlará la disposición en el eje horizontal de las áreas superpuestas. Solo admite uno.</li>
<li>Campo “<em>Leyenda</em>”: recibirá el criterio de segmentación que dividirá el área de la gráfica en áreas menores superpuestas. Solo admite uno.</li>
<li>Campo “<em>Valor</em>”: recibirá el valor base a mostrar. Solo admite uno.</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 de los segmentos de las barras horizontales.</li>
</ul>Llevemos, por ejemplo, la medida <em>Sales</em> al campo <em>Valores</em>, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje</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/area_chart_02.jpg"></a>
Vemos que el valor a representar (ventas) se ha desglosado según el criterio que hayamos llevado al campo <em>Eje</em> (el año de venta) y que los puntos resultantes se han unido por medio de una línea y se ha coloreado el área inferior para reforzar la idea de ventas acumuladas y sus cambios de año a año.
Si llevamos otro campo -por ejemplo el campo <em>Country</em> conteniendo el país en el que se realiza la venta- al campo <em>Leyenda</em>, los valores anteriores se desglosan según el nuevo criterio:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_03.jpg"></a>
Si movemos el cursor por encima de la gráfica, se abrirá una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_04.jpg"></a>
La visualización nos permite personalizar los colores, personalizar los ejes X e Y, mostrar u ocultar la leyenda, y mostrar o no las etiquetas correspondientes a los valores representados (<em>Formato > Etiquetas de datos</em>):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_05.jpg"></a>
Si al campo <em>Eje</em> llevásemos una jerarquía (por ejemplo, de fechas), la visualización nos mostraría los típicos controles que nos permitirían recorrer la jerarquía verticalmente (en este caso, mostrando las ventas por año, trimestres, meses...).
Es de destacar que este tipo de visualización tiene un importante riesgo, y es que el lector puede quedarse con la duda de si se trata de una gráfica de áreas o de una gráfica de áreas apiladas. En un caso como el mostrado en la imagen anterior, en el que una línea (la roja) cruza otra línea (la violeta), queda claro (o debería quedar claro) que no se trata de una gráfica de áreas apiladas, pero habrá muchos casos en los que la gráfica no resuelva la duda. Por otro lado, otro inconveniente adicional proviene del hecho de que unas áreas solapan con otras, por lo que los colores no son siempre bien interpretados (y, por supuesto, esto si las áreas no son completamente opacas: si lo son, es posible incluso que unas áreas oculten las que quedan por detrás).
Es por ello que el uso de esta gráfica debe realizarse solo cuando estemos seguros de que el mensaje a transmitir va a ser claro y que la gráfica está bien personalizada de forma que no haya dudas sobre su interpretació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-2eb397f0-dae5-4acd-b026-8840a716bbae') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Gráfico de áreas</strong> o <strong>Area chart</strong> permite mostrar tendencias en el tiempo o por categorías. Está especialmente indicado cuando el orden de las categorías es importante o cuando es importante resaltar la magnitud de los cambios con el tiempo. Echemos un vistazo al panel de configuración de esta 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/area_chart_01.jpg"></a>
En este tipo de visualizaciones trabajaremos con un valor base a mostrar en la gráfica mediante áreas superpuestas (todas tienen como valor inferior el valor 0 del eje vertical), un criterio de segmentación principal (responsable de las áreas superpuestas a mostrar) y otro secundario que controlará la disposición en el eje horizontal de las áreas.
<ul><li>Campo “<em>Eje</em>”: recibirá el criterio de segmentación que controlará la disposición en el eje horizontal de las áreas superpuestas. Solo admite uno.</li>
<li>Campo “<em>Leyenda</em>”: recibirá el criterio de segmentación que dividirá el área de la gráfica en áreas menores superpuestas. Solo admite uno.</li>
<li>Campo “<em>Valor</em>”: recibirá el valor base a mostrar. Solo admite uno.</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 de los segmentos de las barras horizontales.</li>
</ul>Llevemos, por ejemplo, la medida <em>Sales</em> al campo <em>Valores</em>, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje</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/area_chart_02.jpg"></a>
Vemos que el valor a representar (ventas) se ha desglosado según el criterio que hayamos llevado al campo <em>Eje</em> (el año de venta) y que los puntos resultantes se han unido por medio de una línea y se ha coloreado el área inferior para reforzar la idea de ventas acumuladas y sus cambios de año a año.
Si llevamos otro campo -por ejemplo el campo <em>Country</em> conteniendo el país en el que se realiza la venta- al campo <em>Leyenda</em>, los valores anteriores se desglosan según el nuevo criterio:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_03.jpg"></a>
Si movemos el cursor por encima de la gráfica, se abrirá una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_04.jpg"></a>
La visualización nos permite personalizar los colores, personalizar los ejes X e Y, mostrar u ocultar la leyenda, y mostrar o no las etiquetas correspondientes a los valores representados (<em>Formato > Etiquetas de datos</em>):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_05.jpg"></a>
Si al campo <em>Eje</em> llevásemos una jerarquía (por ejemplo, de fechas), la visualización nos mostraría los típicos controles que nos permitirían recorrer la jerarquía verticalmente (en este caso, mostrando las ventas por año, trimestres, meses...).
Es de destacar que este tipo de visualización tiene un importante riesgo, y es que el lector puede quedarse con la duda de si se trata de una gráfica de áreas o de una gráfica de áreas apiladas. En un caso como el mostrado en la imagen anterior, en el que una línea (la roja) cruza otra línea (la violeta), queda claro (o debería quedar claro) que no se trata de una gráfica de áreas apiladas, pero habrá muchos casos en los que la gráfica no resuelva la duda. Por otro lado, otro inconveniente adicional proviene del hecho de que unas áreas solapan con otras, por lo que los colores no son siempre bien interpretados (y, por supuesto, esto si las áreas no son completamente opacas: si lo son, es posible incluso que unas áreas oculten las que quedan por detrás).
Es por ello que el uso de esta gráfica debe realizarse solo cuando estemos seguros de que el mensaje a transmitir va a ser claro y que la gráfica está bien personalizada de forma que no haya dudas sobre su interpretació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-2eb397f0-dae5-4acd-b026-8840a716bbae') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Gráfico de áreas</strong> o <strong>Area chart</strong> permite mostrar tendencias en el tiempo o por categorías. Está especialmente indicado cuando el orden de las categorías es importante o cuando es importante resaltar la magnitud de los cambios con el tiempo. Echemos un vistazo al panel de configuración de esta 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/area_chart_01.jpg"></a>
En este tipo de visualizaciones trabajaremos con un valor base a mostrar en la gráfica mediante áreas superpuestas (todas tienen como valor inferior el valor 0 del eje vertical), un criterio de segmentación principal (responsable de las áreas superpuestas a mostrar) y otro secundario que controlará la disposición en el eje horizontal de las áreas.
<ul><li>Campo “<em>Eje</em>”: recibirá el criterio de segmentación que controlará la disposición en el eje horizontal de las áreas superpuestas. Solo admite uno.</li>
<li>Campo “<em>Leyenda</em>”: recibirá el criterio de segmentación que dividirá el área de la gráfica en áreas menores superpuestas. Solo admite uno.</li>
<li>Campo “<em>Valor</em>”: recibirá el valor base a mostrar. Solo admite uno.</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 de los segmentos de las barras horizontales.</li>
</ul>Llevemos, por ejemplo, la medida <em>Sales</em> al campo <em>Valores</em>, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje</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/area_chart_02.jpg"></a>
Vemos que el valor a representar (ventas) se ha desglosado según el criterio que hayamos llevado al campo <em>Eje</em> (el año de venta) y que los puntos resultantes se han unido por medio de una línea y se ha coloreado el área inferior para reforzar la idea de ventas acumuladas y sus cambios de año a año.
Si llevamos otro campo -por ejemplo el campo <em>Country</em> conteniendo el país en el que se realiza la venta- al campo <em>Leyenda</em>, los valores anteriores se desglosan según el nuevo criterio:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_03.jpg"></a>
Si movemos el cursor por encima de la gráfica, se abrirá una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_04.jpg"></a>
La visualización nos permite personalizar los colores, personalizar los ejes X e Y, mostrar u ocultar la leyenda, y mostrar o no las etiquetas correspondientes a los valores representados (<em>Formato > Etiquetas de datos</em>):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_05.jpg"></a>
Si al campo <em>Eje</em> llevásemos una jerarquía (por ejemplo, de fechas), la visualización nos mostraría los típicos controles que nos permitirían recorrer la jerarquía verticalmente (en este caso, mostrando las ventas por año, trimestres, meses...).
Es de destacar que este tipo de visualización tiene un importante riesgo, y es que el lector puede quedarse con la duda de si se trata de una gráfica de áreas o de una gráfica de áreas apiladas. En un caso como el mostrado en la imagen anterior, en el que una línea (la roja) cruza otra línea (la violeta), queda claro (o debería quedar claro) que no se trata de una gráfica de áreas apiladas, pero habrá muchos casos en los que la gráfica no resuelva la duda. Por otro lado, otro inconveniente adicional proviene del hecho de que unas áreas solapan con otras, por lo que los colores no son siempre bien interpretados (y, por supuesto, esto si las áreas no son completamente opacas: si lo son, es posible incluso que unas áreas oculten las que quedan por detrás).
Es por ello que el uso de esta gráfica debe realizarse solo cuando estemos seguros de que el mensaje a transmitir va a ser claro y que la gráfica está bien personalizada de forma que no haya dudas sobre su interpretació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-2eb397f0-dae5-4acd-b026-8840a716bbae') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Gráfico de áreas</strong> o <strong>Area chart</strong> permite mostrar tendencias en el tiempo o por categorías. Está especialmente indicado cuando el orden de las categorías es importante o cuando es importante resaltar la magnitud de los cambios con el tiempo. Echemos un vistazo al panel de configuración de esta 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/area_chart_01.jpg"></a>
En este tipo de visualizaciones trabajaremos con un valor base a mostrar en la gráfica mediante áreas superpuestas (todas tienen como valor inferior el valor 0 del eje vertical), un criterio de segmentación principal (responsable de las áreas superpuestas a mostrar) y otro secundario que controlará la disposición en el eje horizontal de las áreas.
<ul><li>Campo “<em>Eje</em>”: recibirá el criterio de segmentación que controlará la disposición en el eje horizontal de las áreas superpuestas. Solo admite uno.</li>
<li>Campo “<em>Leyenda</em>”: recibirá el criterio de segmentación que dividirá el área de la gráfica en áreas menores superpuestas. Solo admite uno.</li>
<li>Campo “<em>Valor</em>”: recibirá el valor base a mostrar. Solo admite uno.</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 de los segmentos de las barras horizontales.</li>
</ul>Llevemos, por ejemplo, la medida <em>Sales</em> al campo <em>Valores</em>, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje</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/area_chart_02.jpg"></a>
Vemos que el valor a representar (ventas) se ha desglosado según el criterio que hayamos llevado al campo <em>Eje</em> (el año de venta) y que los puntos resultantes se han unido por medio de una línea y se ha coloreado el área inferior para reforzar la idea de ventas acumuladas y sus cambios de año a año.
Si llevamos otro campo -por ejemplo el campo <em>Country</em> conteniendo el país en el que se realiza la venta- al campo <em>Leyenda</em>, los valores anteriores se desglosan según el nuevo criterio:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_03.jpg"></a>
Si movemos el cursor por encima de la gráfica, se abrirá una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_04.jpg"></a>
La visualización nos permite personalizar los colores, personalizar los ejes X e Y, mostrar u ocultar la leyenda, y mostrar o no las etiquetas correspondientes a los valores representados (<em>Formato > Etiquetas de datos</em>):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_05.jpg"></a>
Si al campo <em>Eje</em> llevásemos una jerarquía (por ejemplo, de fechas), la visualización nos mostraría los típicos controles que nos permitirían recorrer la jerarquía verticalmente (en este caso, mostrando las ventas por año, trimestres, meses...).
Es de destacar que este tipo de visualización tiene un importante riesgo, y es que el lector puede quedarse con la duda de si se trata de una gráfica de áreas o de una gráfica de áreas apiladas. En un caso como el mostrado en la imagen anterior, en el que una línea (la roja) cruza otra línea (la violeta), queda claro (o debería quedar claro) que no se trata de una gráfica de áreas apiladas, pero habrá muchos casos en los que la gráfica no resuelva la duda. Por otro lado, otro inconveniente adicional proviene del hecho de que unas áreas solapan con otras, por lo que los colores no son siempre bien interpretados (y, por supuesto, esto si las áreas no son completamente opacas: si lo son, es posible incluso que unas áreas oculten las que quedan por detrás).
Es por ello que el uso de esta gráfica debe realizarse solo cuando estemos seguros de que el mensaje a transmitir va a ser claro y que la gráfica está bien personalizada de forma que no haya dudas sobre su interpretació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-2eb397f0-dae5-4acd-b026-8840a716bbae') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Gráfico de áreas</strong> o <strong>Area chart</strong> permite mostrar tendencias en el tiempo o por categorías. Está especialmente indicado cuando el orden de las categorías es importante o cuando es importante resaltar la magnitud de los cambios con el tiempo. Echemos un vistazo al panel de configuración de esta 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/area_chart_01.jpg"></a>
En este tipo de visualizaciones trabajaremos con un valor base a mostrar en la gráfica mediante áreas superpuestas (todas tienen como valor inferior el valor 0 del eje vertical), un criterio de segmentación principal (responsable de las áreas superpuestas a mostrar) y otro secundario que controlará la disposición en el eje horizontal de las áreas.
<ul><li>Campo “<em>Eje</em>”: recibirá el criterio de segmentación que controlará la disposición en el eje horizontal de las áreas superpuestas. Solo admite uno.</li>
<li>Campo “<em>Leyenda</em>”: recibirá el criterio de segmentación que dividirá el área de la gráfica en áreas menores superpuestas. Solo admite uno.</li>
<li>Campo “<em>Valor</em>”: recibirá el valor base a mostrar. Solo admite uno.</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 de los segmentos de las barras horizontales.</li>
</ul>Llevemos, por ejemplo, la medida <em>Sales</em> al campo <em>Valores</em>, y el campo <em>Año</em> de nuestro calendario al campo <em>Eje</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/area_chart_02.jpg"></a>
Vemos que el valor a representar (ventas) se ha desglosado según el criterio que hayamos llevado al campo <em>Eje</em> (el año de venta) y que los puntos resultantes se han unido por medio de una línea y se ha coloreado el área inferior para reforzar la idea de ventas acumuladas y sus cambios de año a año.
Si llevamos otro campo -por ejemplo el campo <em>Country</em> conteniendo el país en el que se realiza la venta- al campo <em>Leyenda</em>, los valores anteriores se desglosan según el nuevo criterio:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_03.jpg"></a>
Si movemos el cursor por encima de la gráfica, se abrirá una ventana emergente con la información asociada:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_04.jpg"></a>
La visualización nos permite personalizar los colores, personalizar los ejes X e Y, mostrar u ocultar la leyenda, y mostrar o no las etiquetas correspondientes a los valores representados (<em>Formato > Etiquetas de datos</em>):
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-09/area_chart_05.jpg"></a>
Si al campo <em>Eje</em> llevásemos una jerarquía (por ejemplo, de fechas), la visualización nos mostraría los típicos controles que nos permitirían recorrer la jerarquía verticalmente (en este caso, mostrando las ventas por año, trimestres, meses...).
Es de destacar que este tipo de visualización tiene un importante riesgo, y es que el lector puede quedarse con la duda de si se trata de una gráfica de áreas o de una gráfica de áreas apiladas. En un caso como el mostrado en la imagen anterior, en el que una línea (la roja) cruza otra línea (la violeta), queda claro (o debería quedar claro) que no se trata de una gráfica de áreas apiladas, pero habrá muchos casos en los que la gráfica no resuelva la duda. Por otro lado, otro inconveniente adicional proviene del hecho de que unas áreas solapan con otras, por lo que los colores no son siempre bien interpretados (y, por supuesto, esto si las áreas no son completamente opacas: si lo son, es posible incluso que unas áreas oculten las que quedan por detrás).
Es por ello que el uso de esta gráfica debe realizarse solo cuando estemos seguros de que el mensaje a transmitir va a ser claro y que la gráfica está bien personalizada de forma que no haya dudas sobre su interpretació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-21ed345b-bfe3-4ef0-ac6f-90181e38c0cf') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>Circle KPI Gauge</strong>, es una especie de gráfica de donuts que muestra un porcentaje. Consta de dos anillos, uno interior, fijo, y otro exterior que marca el porcentaje en cuestión. En ambos casos es posible configurar el color, ancho, etc. El panel de configuració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-08/circle_kpi_gauge_01.jpg"></a>
Está compuesto por apenas un único campo que contiene la métrica (el porcentaje) a mostrar. Si llevamos a este campo una medida que calcule el porcentaje de ventas de un cierto país con respecto al total, por ejemplo, el resultado es el mostrado en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_02.jpg"></a>
El color del anillo exterior (el que representa el porcentaje) puede hacerse depender del valor a representar. Para esto, la visualización incluye dos umbrales que dividen los porcentajes en tres zonas, siendo posible asignar a cada zona un color distinto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_03.jpg"></a>
También es posible controlar el ancho de los dos anillos, así como la posición del anillo exterior con respecto al centro del círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_04.jpg"></a>
En la siguiente imagen se muestra el efecto de modificar estas últimas herramientas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_05.jpg"></a>
Y no se incluyen otras opciones de visualización: se puede, por ejemplo, modificar el fondo de toda la visualización, pero no solo el interior del círculo. Tampoco permite dar formato a la etiqueta interior, que se muestra siempre con dos cifras decimales.
En resumen, se trata de una visualización muy sencilla pero que puede resultar muy útil en determinadas circunstancias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-21ed345b-bfe3-4ef0-ac6f-90181e38c0cf') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>Circle KPI Gauge</strong>, es una especie de gráfica de donuts que muestra un porcentaje. Consta de dos anillos, uno interior, fijo, y otro exterior que marca el porcentaje en cuestión. En ambos casos es posible configurar el color, ancho, etc. El panel de configuració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-08/circle_kpi_gauge_01.jpg"></a>
Está compuesto por apenas un único campo que contiene la métrica (el porcentaje) a mostrar. Si llevamos a este campo una medida que calcule el porcentaje de ventas de un cierto país con respecto al total, por ejemplo, el resultado es el mostrado en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_02.jpg"></a>
El color del anillo exterior (el que representa el porcentaje) puede hacerse depender del valor a representar. Para esto, la visualización incluye dos umbrales que dividen los porcentajes en tres zonas, siendo posible asignar a cada zona un color distinto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_03.jpg"></a>
También es posible controlar el ancho de los dos anillos, así como la posición del anillo exterior con respecto al centro del círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_04.jpg"></a>
En la siguiente imagen se muestra el efecto de modificar estas últimas herramientas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_05.jpg"></a>
Y no se incluyen otras opciones de visualización: se puede, por ejemplo, modificar el fondo de toda la visualización, pero no solo el interior del círculo. Tampoco permite dar formato a la etiqueta interior, que se muestra siempre con dos cifras decimales.
En resumen, se trata de una visualización muy sencilla pero que puede resultar muy útil en determinadas circunstancias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-21ed345b-bfe3-4ef0-ac6f-90181e38c0cf') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>Circle KPI Gauge</strong>, es una especie de gráfica de donuts que muestra un porcentaje. Consta de dos anillos, uno interior, fijo, y otro exterior que marca el porcentaje en cuestión. En ambos casos es posible configurar el color, ancho, etc. El panel de configuració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-08/circle_kpi_gauge_01.jpg"></a>
Está compuesto por apenas un único campo que contiene la métrica (el porcentaje) a mostrar. Si llevamos a este campo una medida que calcule el porcentaje de ventas de un cierto país con respecto al total, por ejemplo, el resultado es el mostrado en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_02.jpg"></a>
El color del anillo exterior (el que representa el porcentaje) puede hacerse depender del valor a representar. Para esto, la visualización incluye dos umbrales que dividen los porcentajes en tres zonas, siendo posible asignar a cada zona un color distinto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_03.jpg"></a>
También es posible controlar el ancho de los dos anillos, así como la posición del anillo exterior con respecto al centro del círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_04.jpg"></a>
En la siguiente imagen se muestra el efecto de modificar estas últimas herramientas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_05.jpg"></a>
Y no se incluyen otras opciones de visualización: se puede, por ejemplo, modificar el fondo de toda la visualización, pero no solo el interior del círculo. Tampoco permite dar formato a la etiqueta interior, que se muestra siempre con dos cifras decimales.
En resumen, se trata de una visualización muy sencilla pero que puede resultar muy útil en determinadas circunstancias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-21ed345b-bfe3-4ef0-ac6f-90181e38c0cf') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>Circle KPI Gauge</strong>, es una especie de gráfica de donuts que muestra un porcentaje. Consta de dos anillos, uno interior, fijo, y otro exterior que marca el porcentaje en cuestión. En ambos casos es posible configurar el color, ancho, etc. El panel de configuració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-08/circle_kpi_gauge_01.jpg"></a>
Está compuesto por apenas un único campo que contiene la métrica (el porcentaje) a mostrar. Si llevamos a este campo una medida que calcule el porcentaje de ventas de un cierto país con respecto al total, por ejemplo, el resultado es el mostrado en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_02.jpg"></a>
El color del anillo exterior (el que representa el porcentaje) puede hacerse depender del valor a representar. Para esto, la visualización incluye dos umbrales que dividen los porcentajes en tres zonas, siendo posible asignar a cada zona un color distinto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_03.jpg"></a>
También es posible controlar el ancho de los dos anillos, así como la posición del anillo exterior con respecto al centro del círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_04.jpg"></a>
En la siguiente imagen se muestra el efecto de modificar estas últimas herramientas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_05.jpg"></a>
Y no se incluyen otras opciones de visualización: se puede, por ejemplo, modificar el fondo de toda la visualización, pero no solo el interior del círculo. Tampoco permite dar formato a la etiqueta interior, que se muestra siempre con dos cifras decimales.
En resumen, se trata de una visualización muy sencilla pero que puede resultar muy útil en determinadas circunstancias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-7f62cc1b-4801-4a81-8a31-e05ccad0fb15') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>Circle KPI Gauge</strong>, es una especie de gráfica de donuts que muestra un porcentaje. Consta de dos anillos, uno interior, fijo, y otro exterior que marca el porcentaje en cuestión. En ambos casos es posible configurar el color, ancho, etc. El panel de configuració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-08/circle_kpi_gauge_01.jpg"></a>
Está compuesto por apenas un único campo que contiene la métrica (el porcentaje) a mostrar. Si llevamos a este campo una medida que calcule el porcentaje de ventas de un cierto país con respecto al total, por ejemplo, el resultado es el mostrado en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_02.jpg"></a>
El color del anillo exterior (el que representa el porcentaje) puede hacerse depender del valor a representar. Para esto, la visualización incluye dos umbrales que dividen los porcentajes en tres zonas, siendo posible asignar a cada zona un color distinto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_03.jpg"></a>
También es posible controlar el ancho de los dos anillos, así como la posición del anillo exterior con respecto al centro del círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_04.jpg"></a>
En la siguiente imagen se muestra el efecto de modificar estas últimas herramientas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_05.jpg"></a>
Y no se incluyen otras opciones de visualización: se puede, por ejemplo, modificar el fondo de toda la visualización, pero no solo el interior del círculo. Tampoco permite dar formato a la etiqueta interior, que se muestra siempre con dos cifras decimales.
En resumen, se trata de una visualización muy sencilla pero que puede resultar muy útil en determinadas circunstancias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-7f62cc1b-4801-4a81-8a31-e05ccad0fb15') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>Circle KPI Gauge</strong>, es una especie de gráfica de donuts que muestra un porcentaje. Consta de dos anillos, uno interior, fijo, y otro exterior que marca el porcentaje en cuestión. En ambos casos es posible configurar el color, ancho, etc. El panel de configuració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-08/circle_kpi_gauge_01.jpg"></a>
Está compuesto por apenas un único campo que contiene la métrica (el porcentaje) a mostrar. Si llevamos a este campo una medida que calcule el porcentaje de ventas de un cierto país con respecto al total, por ejemplo, el resultado es el mostrado en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_02.jpg"></a>
El color del anillo exterior (el que representa el porcentaje) puede hacerse depender del valor a representar. Para esto, la visualización incluye dos umbrales que dividen los porcentajes en tres zonas, siendo posible asignar a cada zona un color distinto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_03.jpg"></a>
También es posible controlar el ancho de los dos anillos, así como la posición del anillo exterior con respecto al centro del círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_04.jpg"></a>
En la siguiente imagen se muestra el efecto de modificar estas últimas herramientas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_05.jpg"></a>
Y no se incluyen otras opciones de visualización: se puede, por ejemplo, modificar el fondo de toda la visualización, pero no solo el interior del círculo. Tampoco permite dar formato a la etiqueta interior, que se muestra siempre con dos cifras decimales.
En resumen, se trata de una visualización muy sencilla pero que puede resultar muy útil en determinadas circunstancias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-7f62cc1b-4801-4a81-8a31-e05ccad0fb15') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>Circle KPI Gauge</strong>, es una especie de gráfica de donuts que muestra un porcentaje. Consta de dos anillos, uno interior, fijo, y otro exterior que marca el porcentaje en cuestión. En ambos casos es posible configurar el color, ancho, etc. El panel de configuració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-08/circle_kpi_gauge_01.jpg"></a>
Está compuesto por apenas un único campo que contiene la métrica (el porcentaje) a mostrar. Si llevamos a este campo una medida que calcule el porcentaje de ventas de un cierto país con respecto al total, por ejemplo, el resultado es el mostrado en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_02.jpg"></a>
El color del anillo exterior (el que representa el porcentaje) puede hacerse depender del valor a representar. Para esto, la visualización incluye dos umbrales que dividen los porcentajes en tres zonas, siendo posible asignar a cada zona un color distinto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_03.jpg"></a>
También es posible controlar el ancho de los dos anillos, así como la posición del anillo exterior con respecto al centro del círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_04.jpg"></a>
En la siguiente imagen se muestra el efecto de modificar estas últimas herramientas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_05.jpg"></a>
Y no se incluyen otras opciones de visualización: se puede, por ejemplo, modificar el fondo de toda la visualización, pero no solo el interior del círculo. Tampoco permite dar formato a la etiqueta interior, que se muestra siempre con dos cifras decimales.
En resumen, se trata de una visualización muy sencilla pero que puede resultar muy útil en determinadas circunstancias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-7f62cc1b-4801-4a81-8a31-e05ccad0fb15') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>Circle KPI Gauge</strong>, es una especie de gráfica de donuts que muestra un porcentaje. Consta de dos anillos, uno interior, fijo, y otro exterior que marca el porcentaje en cuestión. En ambos casos es posible configurar el color, ancho, etc. El panel de configuració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-08/circle_kpi_gauge_01.jpg"></a>
Está compuesto por apenas un único campo que contiene la métrica (el porcentaje) a mostrar. Si llevamos a este campo una medida que calcule el porcentaje de ventas de un cierto país con respecto al total, por ejemplo, el resultado es el mostrado en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_02.jpg"></a>
El color del anillo exterior (el que representa el porcentaje) puede hacerse depender del valor a representar. Para esto, la visualización incluye dos umbrales que dividen los porcentajes en tres zonas, siendo posible asignar a cada zona un color distinto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_03.jpg"></a>
También es posible controlar el ancho de los dos anillos, así como la posición del anillo exterior con respecto al centro del círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_04.jpg"></a>
En la siguiente imagen se muestra el efecto de modificar estas últimas herramientas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_05.jpg"></a>
Y no se incluyen otras opciones de visualización: se puede, por ejemplo, modificar el fondo de toda la visualización, pero no solo el interior del círculo. Tampoco permite dar formato a la etiqueta interior, que se muestra siempre con dos cifras decimales.
En resumen, se trata de una visualización muy sencilla pero que puede resultar muy útil en determinadas circunstancias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-f2a1dd2c-2452-4782-b5d7-d1fb77f0f58b') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>Circle KPI Gauge</strong>, es una especie de gráfica de donuts que muestra un porcentaje. Consta de dos anillos, uno interior, fijo, y otro exterior que marca el porcentaje en cuestión. En ambos casos es posible configurar el color, ancho, etc. El panel de configuració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-08/circle_kpi_gauge_01.jpg"></a>
Está compuesto por apenas un único campo que contiene la métrica (el porcentaje) a mostrar. Si llevamos a este campo una medida que calcule el porcentaje de ventas de un cierto país con respecto al total, por ejemplo, el resultado es el mostrado en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_02.jpg"></a>
El color del anillo exterior (el que representa el porcentaje) puede hacerse depender del valor a representar. Para esto, la visualización incluye dos umbrales que dividen los porcentajes en tres zonas, siendo posible asignar a cada zona un color distinto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_03.jpg"></a>
También es posible controlar el ancho de los dos anillos, así como la posición del anillo exterior con respecto al centro del círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_04.jpg"></a>
En la siguiente imagen se muestra el efecto de modificar estas últimas herramientas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_05.jpg"></a>
Y no se incluyen otras opciones de visualización: se puede, por ejemplo, modificar el fondo de toda la visualización, pero no solo el interior del círculo. Tampoco permite dar formato a la etiqueta interior, que se muestra siempre con dos cifras decimales.
En resumen, se trata de una visualización muy sencilla pero que puede resultar muy útil en determinadas circunstancias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-f2a1dd2c-2452-4782-b5d7-d1fb77f0f58b') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>Circle KPI Gauge</strong>, es una especie de gráfica de donuts que muestra un porcentaje. Consta de dos anillos, uno interior, fijo, y otro exterior que marca el porcentaje en cuestión. En ambos casos es posible configurar el color, ancho, etc. El panel de configuració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-08/circle_kpi_gauge_01.jpg"></a>
Está compuesto por apenas un único campo que contiene la métrica (el porcentaje) a mostrar. Si llevamos a este campo una medida que calcule el porcentaje de ventas de un cierto país con respecto al total, por ejemplo, el resultado es el mostrado en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_02.jpg"></a>
El color del anillo exterior (el que representa el porcentaje) puede hacerse depender del valor a representar. Para esto, la visualización incluye dos umbrales que dividen los porcentajes en tres zonas, siendo posible asignar a cada zona un color distinto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_03.jpg"></a>
También es posible controlar el ancho de los dos anillos, así como la posición del anillo exterior con respecto al centro del círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_04.jpg"></a>
En la siguiente imagen se muestra el efecto de modificar estas últimas herramientas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_05.jpg"></a>
Y no se incluyen otras opciones de visualización: se puede, por ejemplo, modificar el fondo de toda la visualización, pero no solo el interior del círculo. Tampoco permite dar formato a la etiqueta interior, que se muestra siempre con dos cifras decimales.
En resumen, se trata de una visualización muy sencilla pero que puede resultar muy útil en determinadas circunstancias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-f2a1dd2c-2452-4782-b5d7-d1fb77f0f58b') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>Circle KPI Gauge</strong>, es una especie de gráfica de donuts que muestra un porcentaje. Consta de dos anillos, uno interior, fijo, y otro exterior que marca el porcentaje en cuestión. En ambos casos es posible configurar el color, ancho, etc. El panel de configuració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-08/circle_kpi_gauge_01.jpg"></a>
Está compuesto por apenas un único campo que contiene la métrica (el porcentaje) a mostrar. Si llevamos a este campo una medida que calcule el porcentaje de ventas de un cierto país con respecto al total, por ejemplo, el resultado es el mostrado en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_02.jpg"></a>
El color del anillo exterior (el que representa el porcentaje) puede hacerse depender del valor a representar. Para esto, la visualización incluye dos umbrales que dividen los porcentajes en tres zonas, siendo posible asignar a cada zona un color distinto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_03.jpg"></a>
También es posible controlar el ancho de los dos anillos, así como la posición del anillo exterior con respecto al centro del círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_04.jpg"></a>
En la siguiente imagen se muestra el efecto de modificar estas últimas herramientas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_05.jpg"></a>
Y no se incluyen otras opciones de visualización: se puede, por ejemplo, modificar el fondo de toda la visualización, pero no solo el interior del círculo. Tampoco permite dar formato a la etiqueta interior, que se muestra siempre con dos cifras decimales.
En resumen, se trata de una visualización muy sencilla pero que puede resultar muy útil en determinadas circunstancias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-f2a1dd2c-2452-4782-b5d7-d1fb77f0f58b') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>Circle KPI Gauge</strong>, es una especie de gráfica de donuts que muestra un porcentaje. Consta de dos anillos, uno interior, fijo, y otro exterior que marca el porcentaje en cuestión. En ambos casos es posible configurar el color, ancho, etc. El panel de configuració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-08/circle_kpi_gauge_01.jpg"></a>
Está compuesto por apenas un único campo que contiene la métrica (el porcentaje) a mostrar. Si llevamos a este campo una medida que calcule el porcentaje de ventas de un cierto país con respecto al total, por ejemplo, el resultado es el mostrado en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_02.jpg"></a>
El color del anillo exterior (el que representa el porcentaje) puede hacerse depender del valor a representar. Para esto, la visualización incluye dos umbrales que dividen los porcentajes en tres zonas, siendo posible asignar a cada zona un color distinto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_03.jpg"></a>
También es posible controlar el ancho de los dos anillos, así como la posición del anillo exterior con respecto al centro del círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_04.jpg"></a>
En la siguiente imagen se muestra el efecto de modificar estas últimas herramientas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_05.jpg"></a>
Y no se incluyen otras opciones de visualización: se puede, por ejemplo, modificar el fondo de toda la visualización, pero no solo el interior del círculo. Tampoco permite dar formato a la etiqueta interior, que se muestra siempre con dos cifras decimales.
En resumen, se trata de una visualización muy sencilla pero que puede resultar muy útil en determinadas circunstancias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-6056d341-8092-4adb-bf48-42cbe948a63e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>Circle KPI Gauge</strong>, es una especie de gráfica de donuts que muestra un porcentaje. Consta de dos anillos, uno interior, fijo, y otro exterior que marca el porcentaje en cuestión. En ambos casos es posible configurar el color, ancho, etc. El panel de configuració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-08/circle_kpi_gauge_01.jpg"></a>
Está compuesto por apenas un único campo que contiene la métrica (el porcentaje) a mostrar. Si llevamos a este campo una medida que calcule el porcentaje de ventas de un cierto país con respecto al total, por ejemplo, el resultado es el mostrado en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_02.jpg"></a>
El color del anillo exterior (el que representa el porcentaje) puede hacerse depender del valor a representar. Para esto, la visualización incluye dos umbrales que dividen los porcentajes en tres zonas, siendo posible asignar a cada zona un color distinto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_03.jpg"></a>
También es posible controlar el ancho de los dos anillos, así como la posición del anillo exterior con respecto al centro del círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_04.jpg"></a>
En la siguiente imagen se muestra el efecto de modificar estas últimas herramientas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_05.jpg"></a>
Y no se incluyen otras opciones de visualización: se puede, por ejemplo, modificar el fondo de toda la visualización, pero no solo el interior del círculo. Tampoco permite dar formato a la etiqueta interior, que se muestra siempre con dos cifras decimales.
En resumen, se trata de una visualización muy sencilla pero que puede resultar muy útil en determinadas circunstancias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-6056d341-8092-4adb-bf48-42cbe948a63e') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>Circle KPI Gauge</strong>, es una especie de gráfica de donuts que muestra un porcentaje. Consta de dos anillos, uno interior, fijo, y otro exterior que marca el porcentaje en cuestión. En ambos casos es posible configurar el color, ancho, etc. El panel de configuració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-08/circle_kpi_gauge_01.jpg"></a>
Está compuesto por apenas un único campo que contiene la métrica (el porcentaje) a mostrar. Si llevamos a este campo una medida que calcule el porcentaje de ventas de un cierto país con respecto al total, por ejemplo, el resultado es el mostrado en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_02.jpg"></a>
El color del anillo exterior (el que representa el porcentaje) puede hacerse depender del valor a representar. Para esto, la visualización incluye dos umbrales que dividen los porcentajes en tres zonas, siendo posible asignar a cada zona un color distinto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_03.jpg"></a>
También es posible controlar el ancho de los dos anillos, así como la posición del anillo exterior con respecto al centro del círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_04.jpg"></a>
En la siguiente imagen se muestra el efecto de modificar estas últimas herramientas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_05.jpg"></a>
Y no se incluyen otras opciones de visualización: se puede, por ejemplo, modificar el fondo de toda la visualización, pero no solo el interior del círculo. Tampoco permite dar formato a la etiqueta interior, que se muestra siempre con dos cifras decimales.
En resumen, se trata de una visualización muy sencilla pero que puede resultar muy útil en determinadas circunstancias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-6056d341-8092-4adb-bf48-42cbe948a63e') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>Circle KPI Gauge</strong>, es una especie de gráfica de donuts que muestra un porcentaje. Consta de dos anillos, uno interior, fijo, y otro exterior que marca el porcentaje en cuestión. En ambos casos es posible configurar el color, ancho, etc. El panel de configuració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-08/circle_kpi_gauge_01.jpg"></a>
Está compuesto por apenas un único campo que contiene la métrica (el porcentaje) a mostrar. Si llevamos a este campo una medida que calcule el porcentaje de ventas de un cierto país con respecto al total, por ejemplo, el resultado es el mostrado en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_02.jpg"></a>
El color del anillo exterior (el que representa el porcentaje) puede hacerse depender del valor a representar. Para esto, la visualización incluye dos umbrales que dividen los porcentajes en tres zonas, siendo posible asignar a cada zona un color distinto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_03.jpg"></a>
También es posible controlar el ancho de los dos anillos, así como la posición del anillo exterior con respecto al centro del círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_04.jpg"></a>
En la siguiente imagen se muestra el efecto de modificar estas últimas herramientas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_05.jpg"></a>
Y no se incluyen otras opciones de visualización: se puede, por ejemplo, modificar el fondo de toda la visualización, pero no solo el interior del círculo. Tampoco permite dar formato a la etiqueta interior, que se muestra siempre con dos cifras decimales.
En resumen, se trata de una visualización muy sencilla pero que puede resultar muy útil en determinadas circunstancias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-6056d341-8092-4adb-bf48-42cbe948a63e') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>Circle KPI Gauge</strong>, es una especie de gráfica de donuts que muestra un porcentaje. Consta de dos anillos, uno interior, fijo, y otro exterior que marca el porcentaje en cuestión. En ambos casos es posible configurar el color, ancho, etc. El panel de configuració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-08/circle_kpi_gauge_01.jpg"></a>
Está compuesto por apenas un único campo que contiene la métrica (el porcentaje) a mostrar. Si llevamos a este campo una medida que calcule el porcentaje de ventas de un cierto país con respecto al total, por ejemplo, el resultado es el mostrado en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_02.jpg"></a>
El color del anillo exterior (el que representa el porcentaje) puede hacerse depender del valor a representar. Para esto, la visualización incluye dos umbrales que dividen los porcentajes en tres zonas, siendo posible asignar a cada zona un color distinto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_03.jpg"></a>
También es posible controlar el ancho de los dos anillos, así como la posición del anillo exterior con respecto al centro del círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_04.jpg"></a>
En la siguiente imagen se muestra el efecto de modificar estas últimas herramientas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_05.jpg"></a>
Y no se incluyen otras opciones de visualización: se puede, por ejemplo, modificar el fondo de toda la visualización, pero no solo el interior del círculo. Tampoco permite dar formato a la etiqueta interior, que se muestra siempre con dos cifras decimales.
En resumen, se trata de una visualización muy sencilla pero que puede resultar muy útil en determinadas circunstancias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-1c8288e5-f575-46b7-a9fb-46a0e4248b1d') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>Circle KPI Gauge</strong>, es una especie de gráfica de donuts que muestra un porcentaje. Consta de dos anillos, uno interior, fijo, y otro exterior que marca el porcentaje en cuestión. En ambos casos es posible configurar el color, ancho, etc. El panel de configuració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-08/circle_kpi_gauge_01.jpg"></a>
Está compuesto por apenas un único campo que contiene la métrica (el porcentaje) a mostrar. Si llevamos a este campo una medida que calcule el porcentaje de ventas de un cierto país con respecto al total, por ejemplo, el resultado es el mostrado en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_02.jpg"></a>
El color del anillo exterior (el que representa el porcentaje) puede hacerse depender del valor a representar. Para esto, la visualización incluye dos umbrales que dividen los porcentajes en tres zonas, siendo posible asignar a cada zona un color distinto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_03.jpg"></a>
También es posible controlar el ancho de los dos anillos, así como la posición del anillo exterior con respecto al centro del círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_04.jpg"></a>
En la siguiente imagen se muestra el efecto de modificar estas últimas herramientas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_05.jpg"></a>
Y no se incluyen otras opciones de visualización: se puede, por ejemplo, modificar el fondo de toda la visualización, pero no solo el interior del círculo. Tampoco permite dar formato a la etiqueta interior, que se muestra siempre con dos cifras decimales.
En resumen, se trata de una visualización muy sencilla pero que puede resultar muy útil en determinadas circunstancias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-1c8288e5-f575-46b7-a9fb-46a0e4248b1d') (Line: 95)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>Circle KPI Gauge</strong>, es una especie de gráfica de donuts que muestra un porcentaje. Consta de dos anillos, uno interior, fijo, y otro exterior que marca el porcentaje en cuestión. En ambos casos es posible configurar el color, ancho, etc. El panel de configuració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-08/circle_kpi_gauge_01.jpg"></a>
Está compuesto por apenas un único campo que contiene la métrica (el porcentaje) a mostrar. Si llevamos a este campo una medida que calcule el porcentaje de ventas de un cierto país con respecto al total, por ejemplo, el resultado es el mostrado en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_02.jpg"></a>
El color del anillo exterior (el que representa el porcentaje) puede hacerse depender del valor a representar. Para esto, la visualización incluye dos umbrales que dividen los porcentajes en tres zonas, siendo posible asignar a cada zona un color distinto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_03.jpg"></a>
También es posible controlar el ancho de los dos anillos, así como la posición del anillo exterior con respecto al centro del círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_04.jpg"></a>
En la siguiente imagen se muestra el efecto de modificar estas últimas herramientas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_05.jpg"></a>
Y no se incluyen otras opciones de visualización: se puede, por ejemplo, modificar el fondo de toda la visualización, pero no solo el interior del círculo. Tampoco permite dar formato a la etiqueta interior, que se muestra siempre con dos cifras decimales.
En resumen, se trata de una visualización muy sencilla pero que puede resultar muy útil en determinadas circunstancias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterMetaData is deprecated in Drupal\Core\Database\Query\Select->addMetaData() (line 178 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-1c8288e5-f575-46b7-a9fb-46a0e4248b1d') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>Circle KPI Gauge</strong>, es una especie de gráfica de donuts que muestra un porcentaje. Consta de dos anillos, uno interior, fijo, y otro exterior que marca el porcentaje en cuestión. En ambos casos es posible configurar el color, ancho, etc. El panel de configuració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-08/circle_kpi_gauge_01.jpg"></a>
Está compuesto por apenas un único campo que contiene la métrica (el porcentaje) a mostrar. Si llevamos a este campo una medida que calcule el porcentaje de ventas de un cierto país con respecto al total, por ejemplo, el resultado es el mostrado en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_02.jpg"></a>
El color del anillo exterior (el que representa el porcentaje) puede hacerse depender del valor a representar. Para esto, la visualización incluye dos umbrales que dividen los porcentajes en tres zonas, siendo posible asignar a cada zona un color distinto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_03.jpg"></a>
También es posible controlar el ancho de los dos anillos, así como la posición del anillo exterior con respecto al centro del círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_04.jpg"></a>
En la siguiente imagen se muestra el efecto de modificar estas últimas herramientas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_05.jpg"></a>
Y no se incluyen otras opciones de visualización: se puede, por ejemplo, modificar el fondo de toda la visualización, pero no solo el interior del círculo. Tampoco permite dar formato a la etiqueta interior, que se muestra siempre con dos cifras decimales.
En resumen, se trata de una visualización muy sencilla pero que puede resultar muy útil en determinadas circunstancias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23)
Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
- Deprecated function: Creation of dynamic property Drupal\mysql\Driver\Database\mysql\Select::$alterTags is deprecated in Drupal\Core\Database\Query\Select->addTag() (line 149 of core/lib/Drupal/Core/Database/Query/Select.php).
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147)
Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80)
Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640)
Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63)
Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'insert-max_800_px-1c8288e5-f575-46b7-a9fb-46a0e4248b1d') (Line: 124)
Drupal\editor\Plugin\Filter\EditorFileReference->process('Esta visualización, <strong>Circle KPI Gauge</strong>, es una especie de gráfica de donuts que muestra un porcentaje. Consta de dos anillos, uno interior, fijo, y otro exterior que marca el porcentaje en cuestión. En ambos casos es posible configurar el color, ancho, etc. El panel de configuració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-08/circle_kpi_gauge_01.jpg"></a>
Está compuesto por apenas un único campo que contiene la métrica (el porcentaje) a mostrar. Si llevamos a este campo una medida que calcule el porcentaje de ventas de un cierto país con respecto al total, por ejemplo, el resultado es el mostrado en la siguiente imagen:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_02.jpg"></a>
El color del anillo exterior (el que representa el porcentaje) puede hacerse depender del valor a representar. Para esto, la visualización incluye dos umbrales que dividen los porcentajes en tres zonas, siendo posible asignar a cada zona un color distinto:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_03.jpg"></a>
También es posible controlar el ancho de los dos anillos, así como la posición del anillo exterior con respecto al centro del círculo:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_04.jpg"></a>
En la siguiente imagen se muestra el efecto de modificar estas últimas herramientas:
<a class="colorbox insert-colorbox" data-colorbox-gallery="gallery-node" data-insert-class="" data-insert-type="image" href="/sites/default/files/2019-08/circle_kpi_gauge_05.jpg"></a>
Y no se incluyen otras opciones de visualización: se puede, por ejemplo, modificar el fondo de toda la visualización, pero no solo el interior del círculo. Tampoco permite dar formato a la etiqueta interior, que se muestra siempre con dos cifras decimales.
En resumen, se trata de una visualización muy sencilla pero que puede resultar muy útil en determinadas circunstancias.
', 'es') (Line: 118)
Drupal\filter\Element\ProcessedText::preRenderText(Array)
call_user_func_array(Array, Array) (Line: 101)
Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788)
Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88)
__TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 46)
__TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array, Array) (Line: 43)
__TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74)
__TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array) (Line: 479)
Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110)
__TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405)
Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378)
Twig\Template->display(Array) (Line: 390)
Twig\Template->render(Array) (Line: 55)
twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384)
Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433)
Drupal\Core\Render\Renderer->doRender(Array) (Line: 446)
Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204)
Drupal\Core\Render\Renderer->render(Array, ) (Line: 242)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object)
call_user_func(Array, Object, 'kernel.view', Object) (Line: 142)
Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191)
Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128)
Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\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)